在R中使用by()函数,以便返回可行的列表

时间:2016-02-07 15:12:49

标签: r list object

我是R的新手并试图将国际象棋评级(按国家/地区)与人类发展指数或类似的东西联系起来。我正在努力将数据集分成各国的平均评级。

ChessDF <- read.csv("Book3.csv", header=TRUE)
ChessDF <- ChessDF[ which(ChessDF$B.day > 1945),]
ChessMeans <- by(ChessDF$Rtng,ChessDF$Fed, mean, simplify = F)

Rtng =评级,美联储=国家,Book3 / ChessDF是我的数据框架。

但是,如果我这样做,则返回一个相当无用的列表,因为它看起来像这样:

ChessDF$Fed: YEM
[1] 1818.206
----------------------------------------------------------- 
ChessDF$Fed: ZAM
[1] 1896.52
----------------------------------------------------------- 
ChessDF$Fed: ZIM
[1] 1689.874

我想要一个只返回数值的列表,有点像这样:

1818 1896 1689 etc.. 

然后我可以为值分配名称,以便YemMean = 1818等。目前列表不可行。

我发现的解决方案是:

list2env(ChessMeans, envir = .GlobalEnv)

这确实为国家/地区分配了数值,但我很难从全球环境中导出对象,而且似乎是错误的 如何去做吧。任何帮助,将不胜感激!

1 个答案:

答案 0 :(得分:2)

适合我。您建议的1818 1896 1689 etc..可能更好地描述为R lingo中的向量。列表可以包含截然不同的结构,而向量,矩阵和数据框架则具有更严格的形式。

x <- by(iris[, 1], INDICES = iris$Species, FUN = mean)

str(x)

 by [1:3(1d)] 5.01 5.94 6.59
 - attr(*, "dimnames")=List of 1
  ..$ iris$Species: chr [1:3] "setosa" "versicolor" "virginica"
 - attr(*, "call")= language by.default(data = iris[, 1], INDICES = iris$Species, FUN = mean)

x[1]

setosa 
 5.006 

mean(x)
[1] 5.843333

正如您在str(x)看到的那样,这实际上是一个维度的矩阵。您可以像常规向量(x[1])一样访问它,甚至可以将mean(x)等函数应用于它。不要被x 打印的方式所迷惑。仔细看看结构。

类似地

> str(tapply(X = iris[, 1], INDEX = iris$Species, FUN = mean))
 num [1:3(1d)] 5.01 5.94 6.59
 - attr(*, "dimnames")=List of 1
  ..$ : chr [1:3] "setosa" "versicolor" "virginica"

正如我之前的其他人所提到的(请参阅评论部分),而不是产生data.frame。

> str(aggregate(Sepal.Length ~ Species, FUN = mean, data = iris))
'data.frame':   3 obs. of  2 variables:
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 2 3
 $ Sepal.Length: num  5.01 5.94 6.59