根据ID替换不同列中的值

问题描述 投票:0回答:2

我的数据集包含 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从不同列中提取元素?

r dataframe dplyr
2个回答
1
投票

如果您愿意,可以使用您原来的方法

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])

0
投票

您可以在数据框中创建行号来模仿

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
© www.soinside.com 2019 - 2024. All rights reserved.