【问题标题】:Create function to count values across list of columns创建函数以计算列列表中的值
【发布时间】:2018-03-29 20:14:18
【问题描述】:

R 人:

我有一个包含多组列的数据框。每组是一组调查项目。我想计算每个集合中具有特定值的列数。我编写了一个函数来执行此操作,但它会导致重复值列表附加到我的数据框中。

df<- structure(list(RespondentID = c(6764279930, 6779986023, 6760279439, 
6759243066), 
                q1 = c(3L, 3L, 4L, 1L), 
                q2 = c(2L, 2L, 4L, 4L), 
                q3 = c(4L, 2L, 4L, 5L), 
                q0010_0004 = c(1L, 2L, 3L, 1L)),
                    .Names = c("RespondentID", "q1", "q2", "q3", "q4"), 
            row.names = c(NA, 4L), class = "data.frame")


group1<-c("q1","q2","q3","q4")

# Objective: Count number of ratings==4 for each row
# Make function that receives list of columns & 
# then returns ONE column in dataframe with total # columns 
# having certain value (in this case, 4)
countcol<-function(colgroup) {
    s<-subset(df, select=c(colgroup)) #select only the columns designated by list
    s$sum<-Reduce("+", apply(X=s,1,FUN=function(x) (sum(x==4, na.rm = TRUE)))) # count instances of value==4
    s2<-subset(s,select=c(sum))  # return ONE column with result for each row 
    return(s2$sum)  }

countcol(group1)

我的函数countcol 运行没有错误,但如上所述,结果似乎是每行结果的转置列表。我希望每一行都有一个数字来表示值的计数。

我在这里尝试了各种应用功能,但未能成功。有人有小费吗?

谢谢!

【问题讨论】:

  • 你写了一个好问题。如果您提供您想要的结果,这将是一个好问题。另外,sum(df[group1] == 1) 是你要找的吗?
  • 如果我理解正确,您应该可以使用which() 函数很容易地做到这一点:length(which(s == 4))
  • df$new &lt;- apply(df[group1], 1, function(x) length(which(x == 4))) 可以满足您的一切需求。
  • @LAP 如果这是 OP 想要的,rowSums(df[group1]==4) 是另一种选择
  • 是的,@MKR 也在关注它,只需要为行切换列。这可能是最好的解决方案。

标签: r function count apply


【解决方案1】:

rowSums 可以为您提供 OP 正在寻找的结果。每个组的此返回计数为 ratings==4

rowSums(df[2:5]==4)

#1 2 3 4 
#1 0 3 1 

或者只是 OP 的部分功能可以给出答案。

apply(df[2:5], 1, function(x)(sum(x==4)))
#1 2 3 4 
#1 0 3 1 

【讨论】:

  • 不过是rowSums
  • @LAP 我同意,但同时他也提到了小组。我认为colSumsrowSums 对他来说应该足够好了。
  • 对,rowSums 就是我需要的。再次感谢。后续问题:为什么我的 OP 代码没有产生单列结果?
  • Reduce 已过时。您的apply 已经生成了该列,而Reduce 您将此列汇总为一个值。未来编写函数时的另一个提示:始终保持灵活性,因此不要在函数中使用像 df 这样的静态对象,而是使用附加参数(在这种情况下为 function(colgroup, df)
  • @MKR,在你的答案中切换到rowSums,所以OP可以接受它。
猜你喜欢
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
相关资源
最近更新 更多