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

1 つの線形解を編集します。

with(Test , mean(rowSums(table(ID,Thing)>0)))
于 2013-07-16T11:54:43.533 に答える
0

各列のゼロ以外のエントリの数を数えようとしているようです。その場合は、 which を使用して、ゼロ以外の数値を(aka )as.logicalに変換するか、行内のゼロの数を数えて、関連する列の数から減算します。たとえば、コードに正しく従った場合、データフレームはTRUE1

  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または、ゼロ以外のすべての値をTRUEakaに変換し、対象 の列の を1計算するために使用します。rowSums

于 2013-07-16T11:54:29.930 に答える