我有以下代码,它可以满足我的需求。但我想知道是否有更简单/更好的方式到达那里?
我这样做的总体目标是,我正在为整体数据构建一个单独的汇总表,因此从中得出的平均值将进入该汇总。
Test <- data.frame(
ID = c(1,1,1,2,2,2,3,3,3),
Thing = c("Apple","Apple","Pear","Pear","Apple","Apple","Kiwi","Apple","Pear"),
Day = c("Mon","Tue","Wed")
)
countfruit <- function(data){
df <- as.data.frame(table(data$ID,data$Thing))
df <- dcast(df, Var1 ~ Var2)
colnames(df) = c("ID", "Apple","Kiwi", "Pear")
#fixing the counts to apply a 1 for if there is any count there:
df$Apple[df$Apple>0] = 1
df$Kiwi[df$Kiwi>0] = 1
df$Pear[df$Pear>0] = 1
#making a new column in the summary table of how many for each person
df$number <- rowSums(df[2:4])
return(mean(df$number))}
result <- countfruit(Test)
答案 0 :(得分:1)
我认为你使这个问题复杂化了,这里有一个小版本保持相同的理由。
df <- table(data$ID,data$Thing)
mean(rowSums(df>0)) ## mean of non zero by column
编辑一个线性解决方案:
with(Test , mean(rowSums(table(ID,Thing)>0)))
答案 1 :(得分:0)
看起来您正在尝试计算每列中有多少非零条目。如果是这样,请使用as.logical
将任何非零数字转换为TRUE
(又名1
),或者只计算一行中的零数并减去相关列的数量。
例如,如果我正确地遵循了您的代码,那么您的数据框就是
Var1 Apple Kiwi Pear
1 1 2 0 1
2 2 2 0 1
3 3 1 1 1
因此,(ncol(df)-1) - length(df[1,]==0)
为您提供第一行的计数。
或者,使用as.logical
将所有非零值转换为TRUE
又称1
,并计算感兴趣的列上的rowSums
。