3

一意の列 ID が文字の場合、どのように集計を使用しますか?

aggregate(data, list(data$colID), sum)
Error in Summary.factor(c(1L, 1L), na.rm = FALSE) : 
  sum not meaningful for factors

キャラチェンジ..

data$colID<-as.character(data$colID)

aggregate(data, list(data$colID), sum)
Error in FUN(X[[1L]], ...) : invalid 'type' (character) of argument

ddply I get a similar error.  
Error in FUN(X[[1L]], ...) : 
  only defined on a data frame with all numeric variables

colID で集計したいだけで、合計したくありません。他のすべての列を合計したい。

dput(data)
structure(list(colID = structure(c(1L, 1L, 1L, 2L, 2L), .Label = c("a", 
"b"), class = "factor"), col1 = c(1, 0, 0, 0, 2), col2 = c(0, 
1, 0, 2, 0), col3 = c(0, 0, 1, 0, 0), col4 = c(5, 5, 5, 7, 7)), .Names = c("colID", 
"col1", "col2", "col3", "col4"), row.names = c(NA, -5L), class = "data.frame")
4

3 に答える 3

5

これはうまくいくはずです

aggregate(x = DF[, -1], by = list(DF$colID), FUN = "sum")

DF は data.frame です

パッケージddplyからの使用plyr

ddply(DF, .(colID), numcolwise(sum))

   colID col1 col2 col3 col4
1     a    1    1    1   15
2     b    2    2    0   14

acastまたはパッケージdcast からのいずれかを使用reshape2

acast( melt(DF), variable ~ colID, sum)  # a matrix
dcast( melt(DF), variable ~ colID, sum)  # a data.frame

Using colID as id variables
      a  b
col1  1  2
col2  1  2
col3  1  0
col4 15 14

を使用して編集ddplyします。それほどエレガントではありませんが、うまくいきます!

 Sums <- ddply(DF[, -5], .(colID), numcolwise(sum))
 Mean <- ddply(DF[, c(1,5)], .(colID), numcolwise(mean))[,-1]
 cbind(Sums, col4_mean=Mean)
  colID col1 col2 col3 col4_mean
1     a    1    1    1         5
2     b    2    2    0         7
于 2012-09-11T14:28:05.273 に答える
3

これがdata.table解決策です。by 列が因子であるか文字であるかは関係ありません。

library(data.table)
DT <- as.data.table(data)
# Calculates the sum of columns col1, ..., col3
# and mean of col4
merge(DT[, lapply(.SD, sum),by = colID, .SDcols =paste0('col', 1:3)], 
      DT[, lapply(.SD, mean),by = colID, .SDcols ='col4'], 
  by = 'colID')
于 2012-10-25T02:36:48.057 に答える
1
library(reshape2)
melted_data <- melt(df, id.vars = "colID")
dcast(melted_data, colID ~ variable, sum)
于 2012-09-11T14:31:07.097 に答える