【发布时间】: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 <- apply(df[group1], 1, function(x) length(which(x == 4)))可以满足您的一切需求。 -
@LAP 如果这是 OP 想要的,
rowSums(df[group1]==4)是另一种选择 -
是的,@MKR 也在关注它,只需要为行切换列。这可能是最好的解决方案。