2017-09-01 40 views
2

我有这样的代码,在我的R数据帧生成新的列:意义方括号的时候没有逗号确定的行或列

for (i in 2:7){ 
    v <- apply(x[,c(i,i+14,i+28, i+42)],1,sum,na.rm=T) 
    x[paste("income", i-1)] <- v 
} 

为什么没有必要为一个逗号开始之前粘贴功能?我的理解是,为了索引用方括号索引当列,那么它应该在一个逗号后面出现,就像这样:

x[,paste("income", i-1)] 
+3

它是列表子集,因为数据框是列的列表。 – Frank

+0

你能提供一些示例数据吗?我最初的想法是,你的申请创建一个向量,所以你没有额外的列,并可以使用x [粘贴(“收入”,i-1)]。 – user108363

+2

请参阅'?“[”'进行详细讨论。 – lmo

回答

1

所有data.frames也列出,每列是列表中的一个元素。在?[.data.frame,它说

[时和[[与单个向量索引(x[i]x[[i]])使用时,它们的索引就好像它是一个列表中的数据帧。

因此,x[1]如下列表索引:它只返回第一个元素(列)作为data.frame。您也可以通过以下方式指定多个列:x[1:3]返回x前三列的data.frame。

+0

谢谢你的理解! –

2

在该R有两种类型的子集的。欲了解更多信息,请阅读Hadley Wickham的Advanced R中的Subsetting: Simplifying vs preserving。或者,您可以输入?"["。简化子集简化了数据类型,而保留子集保留了数据类型。

  • 如果你简单地使用数据框进行子集化,你可能会得到一个一维数据结构,一个向量。 x[, 1]x[[1]]dplyr::select(x,1)
  • 如果确实使用数据帧保留子集,则数据帧保留一个数据帧。 x[, 1, drop = F]x[1]

让我们做一个简单的例子:

mtcars[2] %>% head(5) 

给你

    cyl 
Mazda RX4    6 
Mazda RX4 Wag   6 
Datsun 710   4 
Hornet 4 Drive  6 
Hornet Sportabout  8 

虽然

mtcars[,2] %>% head(5) 

给你

6 6 4 6 8 

mtcars[2] %>% typeof() 

给你

"list" 

虽然

mtcars[,2] %>% typeof() 

给你

"double" 


mtcars[2] %>% class() 

给你

"data.frame" 

mtcars[,2] %>% class() 

给你

"numeric" 
相关问题