根据列名替换列值

时间:2021-05-26 11:34:44

标签: r dataframe

我有一个包含多个二进制变量的数据框:x1、x2、... x100。我想用列名中的数字替换每列中的条目 1,即:

data$x2[data$x2 == 1] <- 2
data$x3[data$x3 == 1] <- 3
data$x4[data$x4 == 1] <- 4
data$x5[data$x5 == 1] <- 5
...

我怎样才能在循环中实现这一点?

4 个答案:

答案 0 :(得分:2)

使用col

# example data
set.seed(1); d <- as.data.frame(matrix(sample(0:1, 12, replace = TRUE), nrow = 3))
names(d) <- paste0("x", seq(ncol(d)))

d  
#   x1 x2 x3 x4
# 1  0  0  0  1
# 2  1  1  0  0
# 3  0  0  1  0

ix <- d == 1
d[ ix ] <- col(d)[ ix ]

d
#   x1 x2 x3 x4
# 1  0  0  0  4
# 2  1  2  0  0
# 3  0  0  3  0

答案 1 :(得分:2)

dplyr 方法(使用 zx8754 的数据):

library(dplyr)

d %>% 
 mutate(across(starts_with('x'), ~ . * as.numeric(gsub('x', '', cur_column()))))
#>   x1 x2 x3 x4
#> 1  0  0  0  4
#> 2  1  2  0  0
#> 3  0  0  3  0

reprex package (v2.0.0) 于 2021 年 5 月 26 日创建

答案 2 :(得分:1)

这是一个带有 lapply 循环的基本 R 解决方案。

data[-1] <- lapply(names(data)[-1], function(k){
  n <- as.integer(sub("[^[:digit:]]*", "", k))
  data[data[[k]] == 1, k] <- n
  data[[k]]
})
data

测试数据。

set.seed(2021)
data <- replicate(6, rbinom(10, 1, 0.5))
data <- as.data.frame(data)
names(data) <- paste0("x", 1:6)

答案 3 :(得分:0)

基于简单 for 循环的解决方案如下(否则类似于使用 lapply 接受的答案):

for (i in 2:100) {
  k <- paste0('x', i)
  data[data[[k]] == 1, k] <- i
}
相关问题