根据特定条件R查找多个变量/列的频率

时间:2016-10-25 19:36:48

标签: r frequency

我是R的新手,我正在试图找出如何编写代码以根据不同的条件获得多列的频率。

示例数据

ID        Group Age Gender Total_T  Neg_Mood_T  Interpersonal_Prob_T    
6000-01-00  0   9   1   44.00   49.00   42.00   44.00   48.00   40.00
6000-02-00  0   12  1   53.00   54.00   42.00   59.00   52.00   51.00
6000-03-00  0   7   2   72.00   50.00   56.00   58.00   81.00   84.00
6000-04-00  0   7   1   41.00   44.00   49.00   47.00   41.00   40.00
6000-05-00  0   9.5 1   38.00   44.00   42.00   39.00   41.00   40.00
6000-06-00  1   8   1   39.00   38.00   57.00   39.00   41.00   40.00
6000-07-00  1   9   1   38.00   44.00   42.00   39.00   41.00   40.00
6000-08-00  1   18  1   41.00   44.00   44.00   48.00   41.00   40.00
6000-09-00  1   9   2   58.00   54.00   45.00   47.00   69.00   56.00
6000-10-00  1   11  2   42.00   40.00   45.00   47.00   46.00   40.00

所以,我从一个简单的代码开始,根据此代码中的某些条件找出变量中出现的频率:

条件1:

Total_T <- sum(data$Total_T[data$Group==0]>=60, na.rm=TRUE)

条件1:

Total_T <- sum(data$Total_T[data$Group==0]<60, na.rm=TRUE)

但是,对于不同的变量和不同的条件,我需要多次重复这段代码(即条件1将重复4个变量,条件2等等)我想弄清楚如何制作它更有效率。

所以,我希望根据我在群组,年龄和性别上的条件创建一个能够返回Total_T,Neg_Mood_T等频率的代码。

我尝试使用data.frame(table())ddply,但老实说我很难过。

谢谢!

1 个答案:

答案 0 :(得分:0)

我们可以使用subset获取我们需要的部分数据,然后sum

x1 <- subset(data, Group== 0 & Gender == 1, select="Total_T")
sum(x1[x1 >= 60], na.rm=TRUE)
sum(x1[x1 < 60], na.rm=TRUE)

#Wrapped in a function
fun <- function(cols) {
  x1 <- subset(data, Group== 0 & Gender == 1, select=cols)
  sum(x1[x1 >= 60], na.rm=TRUE)
}  

fun("Total_T")
[1] 176
fun("Neg_Mood_T")
[1] 191

如果您想一次性获取所有列,可以使用:

library(dplyr)
data %>% filter(Group == 0 & Gender == 1) %>%
  summarise_at(-(1:4), funs(sum(.[. < 60])))
# Total_T Neg_Mood_T Interpersonal_Prob_T col7 col8 col9
# 1     176        191                  175  189  182  171

修改

将符合条件的Total_T的值相加并将值与描述相符的次数相加之间存在差异。我们可以举例说明:

x <- 1:10

#condition
x > 5

#1. sum values fitting the condition
sum(x[x > 5])
[1] 40

#2. sum number of times a value fits condition
sum(x > 5)
[1] 4