我正在研究R中的数据集(即w3),如下所示:
Q1 Q2 Q3 Q4 WorksheetID UserID
395 2178 2699 1494 3 65
395 2178 2694 1394 3 78
395 1178 2699 1394 3 79
395 278 2699 1394 3 80
295 1188 2799 1494 3 81
395 2278 2699 2394 3 81
395 2178 2699 1394 3 83
495 1178 2709 1394 3 84
395 2198 2799 1294 3 85
395 2178 2699 1394 3 85
395 1178 2699 1394 3 86
每个用户都回答了工作表的4个问题(Q1,Q2,Q3,Q4)。
我想要做的是根据每个问题中回答的答案对用户进行分组。
e.g。第一季度
Q1 freq UserID
295 1 81
395 9 65 78 79 80 81 83 85 85 86
495 1 84
我所做的是
w3Q1<-count(W3,"Q1")
for(i in w3Q1$Q1)
{qry<-paste('select userID from w3 where Q1=',i)
print(i)
print(sqldf(qry))}
我的问题是,如何将上述结果合并到变量Q1,freq,UserID(如上所示)的表中?或者有更简单的方法吗?
非常感谢
答案 0 :(得分:3)
我们可以首先使用table
计算频率并将其强制转换为data.frame
。然后,我们可以paste
UserID
aggregate
与merge
和tbl <- as.data.frame(table(df$Q1))
ids <- aggregate(UserID~Q1, df, paste, collapse=' ')
merge(tbl, ids, by.x='Var1', by.y='Q1')
# Var1 Freq UserID
# 1 295 1 81
# 2 395 9 65 78 79 80 81 83 85 85 86
# 3 495 1 84
两个数据框进行分组:
ViewView
答案 1 :(得分:2)
我们也可以使用summarise
分组'Q1'和dplyr
。
library(dplyr)
df1 %>%
group_by(Q1) %>%
summarise(freq= n(), UserID= toString(UserID))
# Q1 freq UserID
# (int) (int) (chr)
#1 295 1 81
#2 395 9 65, 78, 79, 80, 81, 83, 85, 85, 86
#3 495 1 84
对于问题Q1:问题4,最好使用gather
中的tidyr
重新整形为长格式。
library(tidyr)
gather(df1, Var, Qs, Q1:Q4) %>%
group_by(Var, Qs) %>%
summarise(freq=n(), UserID = toString(UserID))
正如@StevenBeaupré所提到的,如果我们需要list
,我们可以将toString
替换为list(UserID)
使用data.table
的类似方法是将'data.frame'转换为'data.table'(setDT(df1)
),按'Q1'分组,我们得到nrow({{1 }')'freq'和.N
一起'UserID'
paste
对于多个Q列,我们library(data.table)
setDT(df1)[, list(freq=.N, UserID=toString(UserID)), by = Q1]
为“长”格式,然后按组进行汇总。
melt