在r中的某些条件下细分并计算特定列中的多少个值

时间:2018-07-02 09:35:27

标签: r dplyr tidyverse

我是R和数据分析的新手。我有一个与下面的数据库类似的数据库,但数据库更大,我试图找到一种通用的方法来为每个国家计数有多少个行动以及有多少个子问题,值1,值2等。对于每个动作,都有多个问题,子问题和子子问题,但我很想找到一种计算方式

1:每个国家/地区有多少操作,不包括子问题

2:一种方法,可以找出每个国家(行动和问题)有多少个值1的子问题1或2。

id country questionn subquestion value      actionn
06  NIE       1          1        1           1
05  NIG       1          1        1           1
07  TAN       1          1        1           1
08  BEN       1          1        1           1
03  TOG       1          1        2           1
45  MOZ       1          1        2           1
40  ZIM       1          1        1           1
56  COD       1          1        1           1
87  BFA       1          1        1           1
09  IVC       1          1        2           1
08  SOA       1          1        2           1
02  MAL       1          1        2           1
78  MAI       1          1        2           1
35  GUB       1          1        2           1
87  RWA       1          1        2           1
41  ETH       1          1        1           1
06  NIE       1          2        2           1
05  NIG       1          2        1           1
87  BFA       1          2        1           2

我尝试创建数据框的子集,一次为每个国家/地区计数所有内容,但是这将永远花费很长的时间,我想知道是否存在通用的方法。 对于第一个问题,我已经完成了

df1<-df %>% group_by (country) %>% summarise (countries=county)

unique(df1)
count(df1)

对于第二个问题,我正在考虑分别选择并计算具有问题n = 1,子问题= 1,值= 1和actionn = 1的每一行,然后选择并计算每个国家/地区的问题n = 1,子问题n = 2,值= 1,actionn = 1等。值是指问题的答案是1 =是还是2 =否。

感谢您的帮助,非常感谢:)

2 个答案:

答案 0 :(得分:0)

对于第一个问题,您可以尝试执行以下操作:

df %>% filter(subquestion != 2) %>% group_by(country) %>% summarise(num_actions = n())

这将返回每个国家/地区的行动次数,并删除子问题列中没有2的行。请注意,n()函数中的summarize将对组(在这种情况下为国家)中的观察值进行计数。

我不确定我是否完全理解第二个问题,但是我的建议是为您想知道的特定观察结果打一个新标签(每个国家,行动和国家有多少个子问题1或2的值1。问题):

df %>% mutate(country_question_code = paste(country, action, questionn, sep = "_")) %>% group_by(country_question_code) %>% summarize(num_subquestion = n())

答案 1 :(得分:0)

对于问题1的可能解决方案(假设国家/地区名称不是唯一的,并且actionn可以为0、1,2或更大。 只需总数:

df%>%group_by(country)%>% summarise( "Count_actions" = sum(actionn) ) #ignores all other columns.

如果您想计算一个国家出现的次数,请使用n()代替sum(actionn, na.rm=TRUE)。#这可能不是您所希望的,但有时简单的解决方案是最好的  (只需计算国家/地区的频率)

或者df%>%group_by(country, actionn)%>%summarise("count_actions"= n())将为每种类型(例如1,2个或更多操作)提供国家/地区明智的计数。

数据表版本dt[, .(.N), by=.(country, actionn )]

对于问题2:根据需要对数据进行过滤后,对“针对您的问题中的每个问题”使用分组。在这里,为每个“国家/地区,问题和行动”过滤子问题1或2(值(且)为1):

df%>%filter(subquestions <=2 & value==1)%>%group_by( country, question, actionn)%>%summarise("counts_desired"= n(), "sums_desired"= sum(actionn, na.rm=TRUE))

希望这行得通。我也在学习并将其应用于类似数据。 尚未对其进行测试,并已对您的数据做出了某些假设(数字和整洁)。 (旅行时也可以移动!欢呼!!)