如果满足 R 中的条件,则打印列中的值

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

我想创建一个列,该列将创建一个新列

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 dataframe if-statement mutate
3个回答
3
投票

我确信有一种更优雅的方法,但在基本 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

1
投票

我们可以使用

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  

1
投票

这是另一个

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