将多值单元格解析为R中的交叉表

我有一个数据集,当将其导入为CSV时,会导致调查问题的多值单元格允许多个答案。在R中交叉制表单值答案很简单:

ctab(formula = col1 ~ col2,data = tmp) # given dataframe tmp

但是我需要对数据进行交叉表检查,如下所示:

tmp2 <- data.frame ( 
  "level" = c ( "dir","mgr","dir","vp" ),"roles" = c  ("dev,qa","dev,qa,ops","dev")
 )

天真的ctab给我这个(与相关):

                  level
roles          dir mgr vp
  dev            0   0  1
  dev,qa        1   0  0
  dev,ops   1   1  0

但是我需要的是这个(我不是要预先指定dev,qa,ops等):

         dev     qa      ops
dir       2       2       1
mgr       1       1       1
vp        1       0       0

我竭尽所能搜索类似内容。抱歉,如果已经回答。谢谢!

-ctb

asfhd1989 回答:将多值单元格解析为R中的交叉表

以下是使用tidyr

的答案
library(tidyr)
tmp2 <- data.frame (
"level" = c ( "dir","mgr","dir","vp" ),"roles" = c  ("dev,qa","dev,qa,ops","dev")
)
tmp3 <- separate_rows(tmp2,roles)
table(tmp3$level,tmp3$roles)
#>      
#>       dev ops qa
#>   dir   2   1  2
#>   mgr   1   1  1
#>   vp    1   0  0
,

您可以通过首先设置索引然后分割字符串来实现您的目标 该索引很有用,因为它可以防止回收。

library(data.table)
setDT(tmp2)
res <- tmp2[,index:=1:.N][,.(value=unlist(strsplit(roles,","))),.(index,level)]

##> res
##    index level value
## 1:     1   dir   dev
## 2:     1   dir    qa
## 3:     2   mgr   dev
## 4:     2   mgr    qa
## 5:     2   mgr   ops
## 6:     3   dir   dev
## 7:     3   dir    qa
## 8:     3   dir   ops
## 9:     4    vp   dev

请注意此处,因为strsplit返回一个列表,因此必须unlist才能正确格式化结果。 然后,我们只需要dcast就可以了。

dcast(res,level~value,value.var="value")

##    level  ops  qa dev
## 1:   dir    1   2   2
## 2:   mgr    1   1   1
## 3:    vp    0   0   1
本文链接:https://www.f2er.com/2301477.html

大家都在问