我的数据集包含 ID 和许多名称中包含 ID 的列。
data = data.frame(ID = rep(1:3,2),
col1 = 1:6,
col2 = 7:12,
col3 = 13:18)
print(data)
我正在尝试根据不同列的 ID 创建一个变量。
data$new = c(1, 8, 15, 4, 11, 18)
我使用 dplyr 使用
get(paste0())
进行了尝试,但它调用了整个向量,而不是特定元素。
data <- data %>% mutate(new = get(paste0("col",ID)))
我也尝试过 sapply 但它再次给出向量而不是元素
data$new <- sapply(data$ID, function(x) get(paste0("col",ID),data)
如何通过ID从不同列中提取元素?
如果您愿意,可以使用您原来的方法
rowwise()
即
data %>% rowwise() %>% mutate(new = get(paste0("col",ID)))
你也可以这样做:
data$new <- apply(data, 1, \(x) x[x[1]+1])
仅当您only有ID和
col<num>
列并且它们按顺序排列时,上述内容才有效。如果不是这种情况,您可以这样做:
cols = sort(grep("col",names(data),value=T))
data$new <- apply(data[,c("ID", cols)], 1, \(x) x[x[1]+1])
您可以在数据框中创建行号来模仿
rowwise
的行为。
library(dplyr)
data %>%
mutate(rid = row_number()) %>%
mutate(new = get(paste0("col", ID)), .by = rid) %>%
select(-rid)
通过您的
sapply
方法,我认为您不需要 get
列,只需 paste
即可直接索引:
data$new <- sapply(1:nrow(data), \(x) data[x, paste0("col", data[x, "ID"])])
两者给出相同的输出:
ID col1 col2 col3 new
1 1 1 7 13 1
2 2 2 8 14 8
3 3 3 9 15 15
4 1 4 10 16 4
5 2 5 11 17 11
6 3 6 12 18 18