#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))