r - 使用 R 作为数据框中列的字符串中字符的频率

标签 r

我有一个数据框 initial以下格式的

> head(initial)
      Strings
1     A,A,B,C
2       A,B,C
3 A,A,A,A,A,B
4     A,A,B,C
5       A,B,C
6 A,A,A,A,A,B

我想要的数据框是 final
    > head(final)
      Strings A B C
1     A,A,B,C 2 1 1
2       A,B,C 1 1 1
3 A,A,A,A,A,B 5 1 0
4     A,A,B,C 2 1 1
5       A,B,C 1 1 1
6 A,A,A,A,A,B 5 1 0

要生成数据帧,可以使用以下代码来保持高行数
initial<-data.frame(Strings=rep(c("A,A,B,C","A,B,C","A,A,A,A,A,B"),100))
final<-data.frame(Strings=rep(c("A,A,B,C","A,B,C","A,A,A,A,A,B"),100),A=rep(c(2,1,5),100),B=rep(c(1,1,1),100),C=rep(c(1,1,0),100))

我可以实现这一目标的最快方法是什么?任何帮助将不胜感激

最佳答案

我们可以使用 base R此任务的方法。我们拆分“字符串”列( strsplit(...) ),设置输出名称 list与行序列,stack转换为 data.frame使用键/值列,使用 table 获取频率, 转换为 'data.frame' 和 cbind与原始数据集。

 cbind(df1, as.data.frame.matrix(
                  table(
                    stack(
                     setNames(
                       strsplit(as.character(df1$Strings),','), 1:nrow(df1))
                           )[2:1])))
 #          Strings A B C D
 #1         A,B,C,D 1 1 1 1
 #2     A,B,B,D,D,D 1 2 0 3
 #3 A,A,A,A,B,C,D,D 4 1 1 2

或者我们可以使用 mtabulate拆分列后。
library(qdapTools)
cbind(df1, mtabulate(strsplit(as.character(df1$Strings), ',')))
#          Strings A B C D
#1         A,B,C,D 1 1 1 1
#2     A,B,B,D,D,D 1 2 0 3
#3 A,A,A,A,B,C,D,D 4 1 1 2

更新

对于新数据集“初始”,第二种方法有效。如果我们需要以正确的顺序使用第一种方法,转换为factorlevels 一起上课指定为 unique 'ind' 的元素。
df1 <- stack(setNames(strsplit(as.character(initial$Strings), ','),
          seq_len(nrow(initial))))
df1$ind <- factor(df1$ind, levels=unique(df1$ind))
cbind(initial, as.data.frame.matrix(table(df1[2:1])))

关于r - 使用 R 作为数据框中列的字符串中字符的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33055340/

相关文章:

r - 大量行之间的差异

r - ggplot/R中每个方面的可变轴标签格式化程序

R - 使用 tmap() 绘图不显示图例

php - 无法从 PHP 运行 R 命令。路径问题?

r - 如何计算R中的组合和排列?

r - GGPlot 翻转此图

r - 在 R 中创建绑定(bind)指数列

R:在使用 facet_wrap() 时制作更大的图

r - 函数的多行 comment() 属性

r - dplyr::n()返回“错误:不应直接调用此函数”