根据R中另一列的值选择列

时间:2015-11-21 12:24:35

标签: r count sqldf

我正在研究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(如上所示)的表中?或者有更简单的方法吗?

非常感谢

2 个答案:

答案 0 :(得分:3)

我们可以首先使用table计算频率并将其强制转换为data.frame。然后,我们可以paste UserID aggregatemergetbl <- 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