R在最后一行中使用字符汇总data.frame

时间:2014-04-18 13:24:29

标签: r summarization

我有一个由字符列和数字列组成的data.frame。现在我想计算数值列的平均值,并将结果追加到数据帧的末尾。

class1  1    2    5
class2  2    3    6
class3  2    3    2

class1  1    2    1
class2  2    3    6
class3  2    3    2
mean    1.6  2.6  3

我尝试使用colMeans,但这与字符列冲突,我收到以下错误:

Error in colMeans(data, na.rm = FALSE) : 'x' must be numeric

我还试图将colMeans限制为data.frame的部分数据[2:4],但后来我很难追加字符串,因为它没有与原始数据相同的长度。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我同意上述评论,在数据框的末尾加上这些评论并不是一个好主意。

无论如何,你可以借此机会用rapply

扩展你的R-pertoire
str(iris)
# 'data.frame':  150 obs. of  5 variables:
#   $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
# $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
# $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
# $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
# $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

summary(iris)
# Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
# Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  
# 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  
# Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  
# Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  
# 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  
# Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500                  

rapply(iris, mean, classes = c('numeric','integer'))
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
# 5.843333     3.057333     3.758000     1.199333 

但如果你加入他们,你可以做

tmp <- rapply(iris, mean, classes = c('numeric','integer'))
rbind(iris, tmp[match(names(iris), names(tmp))])

tail(rbind(iris, tmp[match(names(iris), names(tmp))]), 5)
#     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
# 147     6.300000    2.500000        5.000    1.900000 virginica
# 148     6.500000    3.000000        5.200    2.000000 virginica
# 149     6.200000    3.400000        5.400    2.300000 virginica
# 150     5.900000    3.000000        5.100    1.800000 virginica
# 151     5.843333    3.057333        3.758    1.199333      <NA>

我很遗憾已经将R-pertoire打造成了

答案 1 :(得分:0)

如果你想坚持到目前为止的colMeans尝试,你可以试试这个:

new <- rbind(mydf, c(V1 = "mean", as.list(colMeans(mydf[2:4]))))
new
#       V1       V2       V3       V4
# 1 class1 1.000000 2.000000 5.000000
# 2 class2 2.000000 3.000000 6.000000
# 3 class3 2.000000 3.000000 2.000000
# 4   mean 1.666667 2.666667 4.333333
str(new)
# 'data.frame':  4 obs. of  4 variables:
#  $ V1: chr  "class1" "class2" "class3" "mean"
#  $ V2: num  1 2 2 1.67
#  $ V3: num  2 3 3 2.67
#  $ V4: num  5 6 2 4.33

根据您创建数据的方式,您可能需要转换&#34; V1&#34;首先到character

mydf$V1 <- as.character(mydf$V1)