根据另一列的内容创建多个列

3
在数据集中,我有一列包含字母的数据,如下所示:
d = data.frame(col1 = c("ABC", "CDE","ACE","BDF"))
d

  col1
1  ABC
2  CDE
3  ACE
4  BDF

我想为col1中包含的每个不同字母创建一个列,并将这些列设置为TRUE/FALSE,如下所示:
  col1     A
1  ABC  TRUE
2  CDE FALSE
3  ACE  TRUE
4  BDF FALSE

但问题是我有25个不同的字符。所以为了识别每一列中包含的不同字符,我已经有了所需的函数:
find.characters <- function(v1){
  x1 <- unique(unlist(strsplit(v1, '')))
  indx <- grepl('[A-Z]', x1)
  c(sort(x1[indx]), sort(x1[!indx]))
}
find.characters(d$col1)

[1] "A" "B" "C" "D" "E" "F"

但是我在根据这个字符列表创建列的时候遇到了困难。
3个回答

3
你可以利用内置的字符向量LETTERS来创建列名,并在每个元素上应用grepl
d[LETTERS] <- sapply(LETTERS, \(l) grepl(l, d$col1))

输出

#   col1     A     B     C     D     E     F     G     H     I     J     K     L     M     N     O     P     Q     R
# 1  ABC  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 2  CDE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 3  ACE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 4  BDF FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#       S     T     U     V     W     X     Y     Z
# 1 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 2 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 3 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 4 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

我之前不知道有内置的LETTERS向量,谢谢,它运行得非常好! - BPeif
我之前不知道 LETTERS 有内置的向量功能,谢谢你,它的效果真的很好! - BPeif
我之前不知道有内置的 LETTERS 向量,谢谢,它的效果真的很好! - undefined

3

有一个非常好的库可以进行这样的操作。它被称为splitstackshape,你可以在你的情况下使用它:

library(splitstackshape)
cSplit_e(d, "col1", "", mode = "binary", type = "character", fill = 0)

  col1 col1_A col1_B col1_C col1_D col1_E col1_F
1  ABC      1      1      1      0      0      0
2  CDE      0      0      1      1      1      0
3  ACE      1      0      1      0      1      0
4  BDF      0      1      0      1      0      1

2

也许你可以试试

> with(d, cbind(d, table(rev(stack(setNames(strsplit(col1, ""), seq_along(col1))))) > 0))
  col1     A     B     C     D     E     F
1  ABC  TRUE  TRUE  TRUE FALSE FALSE FALSE
2  CDE FALSE FALSE  TRUE  TRUE  TRUE FALSE
3  ACE  TRUE FALSE  TRUE FALSE  TRUE FALSE
4  BDF FALSE  TRUE FALSE  TRUE FALSE  TRUE

1
谢谢,你的解决方案也有效,并且它还适用于col1中包含的任何字符(数字、特殊字符..)! - BPeif
1
谢谢,你的解决方案也有效,并且适用于col1中包含的任何字符(数字、特殊字符..)! - BPeif
1
谢谢,你的解决方案也有效,而且它适用于col1中包含的任何字符(数字、特殊字符..)! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接