Как заменить значения во фрейме данных заголовком?

#r #dataframe #replace

#r #фрейм данных #заменить

Вопрос:

Во фрейме данных я хочу использовать R для замены всех значений в столбце> 0 заголовком столбца, начиная с этого:

 d1 d2 d3 d4  
R1  0  1  0     
R2  0  0  1
R3  1  0  0  
  

к этому:

 d1 d2 d3 d4  
R1  0 d3  0     
R2  0  0 d4
R3 d2  0  0
  

Ответ №1:

Вы можете использовать which with arr.ind = TRUE для получения индекса строки и столбца, где значение больше 0. Используйте индекс столбца, чтобы заменить эти значения именами столбцов.

 mat <- which(df[-1] > 0, arr.ind = TRUE)
df[-1][mat] <- names(df)[-1][mat[, 2]]
df

#  d1 d2 d3 d4
#1 R1  0 d3  0
#2 R2  0  0 d4
#3 R3 d2  0  0
  

Мы также можем использовать Map :

 df[-1] <- Map(function(x, y) replace(x, x > 0, y), df[-1], names(df[-1]))
  

данные

 df <- structure(list(d1 = c("R1", "R2", "R3"), d2 = c(0L, 0L, 1L), d3 = c(1L, 0L,
 0L), d4 = c(0L, 1L, 0L)), class = "data.frame", row.names = c(NA, -3L))
  

Комментарии:

1. Затем я получаю сообщение об ошибке закрытия: «объект типа ‘closure’ не поддается подстановке»……

2. Хорошо, я исправил ошибку в своем скрипте, которая делала фрейм данных неузнаваемым как фрейм данных, и я запустил ваш код, но он не произвел никаких желаемых изменений — все единицы все еще там. Может быть, мой импорт неверен? Вот как выглядят первые три строки / столбца: OTU_ID 100_Mycena_vitilis 102_Mycena_galopus 10383_Mycena_latifolia OTUITS1_tjek_1 1 0 0 OTUITS1_tjek_10 0 0 0 OTUITS1_tjek_100 0 0 0 Я импортирую его следующим образом: df<-read.table(«mydataframe.txt «, заголовок = T, строка.имена = 1).

3. @ChristofferBuggeHarder Можете ли вы добавить dput(head(df)) к своему вопросу?

Ответ №2:

Мы можем сделать это за один шаг с помощью

 df[-1] <-  replace(df[-1], df[-1] == 1, rep(names(df[-1]), colSums(df[-1])))
  

Или с помощью ifelse

 df[-1] <- ifelse(df[-1] ==1 , names(df)[-1][col(df[-1])], 0)
  

-вывод

 df
#  d1 d2 d3 d4
#1 R1  0 d3  0
#2 R2  0  0 d4
#3 R3 d2  0  0
  

данные

 df <- structure(list(d1 = c("R1", "R2", "R3"), d2 = c(0L, 0L, 1L), 
    d3 = c(1L, 0L, 0L), d4 = c(0L, 1L, 0L)), class = "data.frame",
    row.names = c(NA, 
-3L))