我有一个我想解决的独特问题。
我有一个数据表,其中包含几种不同类型的信息。 例子如下。
ID|inpSeq|Act |User |Representing
--|----- |----|---- |-----
1 | 123 | s | ABC | NA
1 | 124 | s | ABC | NA
1 | 125 | c | ABC | x1
1 | 126 | c | XYZ | x2
1 | 127 | d | ABC | x2
我要做的是整理数据,以便查看“用户”与“Repres”的关系
换句话说,我希望创建以下输出
ID|Act |User|....
--|------|----|----|----
1 | sscd | ABC| x1 | x2.....
1 | c | XYZ| x2.....
因此,您可以看到原始表格被压缩为“用户”中心视图,而“行动”现在包含用户对单个ID执行的所有活动。
此外,我将此活动整理出来,我需要(动态地,如果不同的话)显示代表他们执行活动的人。这由x1,x2 .....表示,这意味着这可能会增长,具体取决于每个ID / Act / User组合的唯一“代表”方可能如何。
需要注意的一点是,Act字段中的“s”值在代表字段中始终具有NA。所以在那些NA中不需要包含在转换后的视图中。
到目前为止,我已经能够通过使用以下代码获得代码的ID|Act|User
部分
aggregate(Act~ID+User, paste, collapse="", data=df)
但我需要弄清楚如何做其余的事情。这就是我需要你所有帮助的地方。
P.S。 “inpSeq”字段是一个唯一的唯一数字字段,由外部应用程序按顺序创建,它允许按正确的顺序排序活动。
答案 0 :(得分:1)
将您的数据作为数据框df
,您可以dplyr
使用spread
tidyr
函数来获取您想要的内容:
library(dplyr)
library(tidyr)
f <- function(x) { paste(na.omit(x), collapse="") } ## 1.
result <- df %>% spread(Representing, Representing) %>% ## 2.
select(-inpSeq, -`<NA>`) %>% ## 3.
group_by(ID, User) %>% ## 4.
summarise_each(funs(f)))
注意:
f
,它将字符向量折叠为单个字符串,并在过程中省略NA
个。 spread
的第一个参数是键的列名,第二个参数是值的列名。 spread
函数将值分散到多个列中。这些附加列由键命名。在这里,我们将Representing
行分散到以Representing
行命名的多个列中。对您的数据执行该命令的结果为:
## ID inpSeq Act User x1 x2 <NA>
##1 1 123 s ABC <NA> <NA> <NA>
##2 1 124 s ABC <NA> <NA> <NA>
##3 1 125 c ABC x1 <NA> <NA>
##4 1 126 c XYZ <NA> x2 <NA>
##5 1 127 d ABC <NA> x2 <NA>
请注意,现在有三个名为x1
,x2
和<NA>
的其他列替换了原来的Representing
列。
从此结果中,我们使用select
来省略列inpSeq
和<NA>
。
group_by
ID
User
以及其余列的summaries_each
和f
。结果是:
print(result)
##Source: local data frame [2 x 5]
##Groups: ID [?]
## ID User Act x1 x2
## <int> <fctr> <chr> <chr> <chr>
##1 1 ABC sscd x1 x2
##2 1 XYZ c x2