如何用标题替换数据框中的值?

时间:2020-10-03 01:09:50

标签: r dataframe replace

在数据框中,我希望使用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

2 个答案:

答案 0 :(得分:3)

您可以将whicharr.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))