1

我有以下代码,可以满足我的要求。但我想知道是否有更简单/更好的方式到达那里?

我这样做的总体目标是为整体数据建立一个单独的汇总表,因此由此得出的平均值将进入该汇总表。

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)
4

2 回答 2

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)))
于 2013-07-16T11:54:43.533 回答
0

看起来您正在尝试计算每列中有多少非零条目。如果是这样,要么使用as.logicalwhich 将任何非零数转换为TRUE(aka 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将所有非零值转换为TRUEaka1并计算rowSums 感兴趣的列。

于 2013-07-16T11:54:29.930 回答