我有一个包含多个二进制变量的数据框: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
...
我怎样才能在循环中实现这一点?
答案 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
}