我想创建一个列,该列将创建一个新列
New
,如果满足条件,它将打印出与该列(第二个表)关联的字母。
示例输出类似于下面的
New
列:
可重现的示例:
df <- data.frame(c(1,0,1), c(0,0,1), c(0,1,1), c(1,1,0), c(1,0,0))
names(df) <- paste0("C",1:5)
reftab <- data.frame(col1 = paste0("C",1:5),
col2 = LETTERS[1:5])
我确信有一种更优雅的方法,但在基本 R 中,如果您首先使用
apply
跨行查找适当的字母,然后 lapply
迭代这些结果并将它们粘贴在一起,它应该可以工作。
使用这些数据:
df <- data.frame(c(1,0,1), c(0,0,1), c(0,1,1), c(1,1,0), c(1,0,0))
names(df) <- paste0("C",1:5)
reftab <- data.frame(col1 = paste0("C",1:5),
col2 = LETTERS[1:5])
您可以创建新列:
df$New <- lapply(apply(df, 1, \(x) reftab$col2[x == 1]),
paste, collapse = "")
输出:
# C1 C2 C3 C4 C5 New
# 1 1 0 0 1 1 ADE
# 2 0 0 1 1 0 CD
# 3 1 1 1 0 0 ABC
我们可以使用
tibble::deframe()
将 reftab 转换为命名向量。然后,在 mutate 中将它们的值按 cur_column()
进行子集化,最后 paste0
将所有内容组合在一起。
library(dplyr)
library(tibble)
reftab <- deframe(reftab)
df |>
mutate(NEW = across(C1:C5,
\(x) if_else(x ==1,
reftab[cur_column()],
"")) |>
reduce(paste0))
# A tibble: 3 × 6
C1 C2 C3 C4 C5 NEW
<dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 1 0 0 1 1 ADE
2 0 0 1 1 0 CD
3 1 1 1 0 0 ABC
这是另一个
dplyr
解决方案,使用 reftab
作为查找表:
library(dplyr)
df %>%
rowwise() %>%
mutate(New = paste(reftab$col2[which(c_across() == 1)], collapse = ""))
C1 C2 C3 C4 C5 New
<dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 1 0 0 1 1 ADE
2 0 0 1 1 0 CD
3 1 1 1 0 0 ABC