在数据框中,我希望使用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
答案 0 :(得分:3)
您可以将which
与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 :(得分:1)
我们可以一步一步完成
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))