我有一个数据框,例如:
a1 = c(1, 2, 3, 4, 5)
a2 = c(6, 7, 8, 9, 10)
a3 = c(11, 12, 13, 14, 15)
aframe = data.frame(a1, a2, a3)
我尝试了以下方法将其中一列转换为向量,但它不起作用:
avector <- as.vector(aframe['a2'])
class(avector)
[1] "data.frame"
这是我能想到的唯一解决方案,但我假设必须有更好的方法来做到这一点:
class(aframe['a2'])
[1] "data.frame"
avector = c()
for(atmp in aframe['a2']) { avector <- atmp }
class(avector)
[1] "numeric"
注意:我上面的词汇可能有问题,如果有,请纠正我。我仍在学习 R 的世界。此外,任何对这里发生的事情的解释都值得赞赏(即与 Python 或其他语言相关的内容会有所帮助!)
?'[.data.frame'
会让您走得很远。
我将尝试在不犯任何错误的情况下解释这一点,但我打赌这将在评论中引起一两个澄清。
数据框是一个列表。当您使用列名和 [
对数据框进行子集化时,您将得到一个 sublist(或子数据框)。如果您想要实际的原子列,您可以使用 [[
,或者(对我来说)有点令人困惑的是,您可以使用 aframe[,2]
,它返回一个向量,而不是一个子列表。
所以尝试运行这个序列,也许事情会更清楚:
avector <- as.vector(aframe['a2'])
class(avector)
avector <- aframe[['a2']]
class(avector)
avector <- aframe[,2]
class(avector)
现在有一种使用 dplyr
的简单方法可以做到这一点。
dplyr::pull(aframe, a2)
您可以使用 $
提取:
class(aframe$a1)
[1] "numeric"
或双方括号:
class(aframe[["a1"]])
[1] "numeric"
您不需要 as.vector()
,但确实需要正确的索引:avector <- aframe[ , "a2"]
要注意的另一件事是 [
的 drop=FALSE
选项:
R> aframe <- data.frame(a1=c1:5, a2=6:10, a3=11:15)
R> aframe
a1 a2 a3
1 1 6 11
2 2 7 12
3 3 8 13
4 4 9 14
5 5 10 15
R> avector <- aframe[, "a2"]
R> avector
[1] 6 7 8 9 10
R> avector <- aframe[, "a2", drop=FALSE]
R> avector
a2
1 6
2 7
3 8
4 9
5 10
R>
drop=FALSE
的提醒很有用 - 在我可以从 data.frame 中选择 N 列的情况下,在 N=1 的情况下,这对我很有帮助。
你可以试试这样的 -
as.vector(unlist(aframe$a2))
identical
比较两列,这很好。
使用 '[[' 运算符的另一个优点是它同时适用于 data.frame 和 data.table。因此,如果必须为 data.frame 和 data.table 运行该函数,并且您想从中提取一列作为向量,那么
data[["column_name"]]
是最好的。
as.vector(unlist(aframe['a2']))
a1 = c(1, 2, 3, 4, 5)
a2 = c(6, 7, 8, 9, 10)
a3 = c(11, 12, 13, 14, 15)
aframe = data.frame(a1, a2, a3)
avector <- as.vector(aframe['a2'])
avector<-unlist(avector)
#this will return a vector of type "integer"
如果您只使用提取运算符,它将起作用。默认情况下,[] 设置选项 drop=TRUE
,这就是您想要的。有关详细信息,请参阅 ?'['
。
> a1 = c(1, 2, 3, 4, 5)
> a2 = c(6, 7, 8, 9, 10)
> a3 = c(11, 12, 13, 14, 15)
> aframe = data.frame(a1, a2, a3)
> aframe[,'a2']
[1] 6 7 8 9 10
> class(aframe[,'a2'])
[1] "numeric"
我使用列表来过滤数据框,它们是否具有 %in% 列表的值。
我一直通过将 1 列数据框导出到 Excel 来手动创建列表,在其中我将在每个元素周围添加“”,然后粘贴到 R:list <- c("el1", "el2", ...) 这通常是其次是 FilteredData <- 子集(数据,列 %in% 列表)。
在搜索 stackoverflow 并没有找到将 1 列数据帧转换为列表的直观方法后,我现在发布我的第一个 stackoverflow 贡献:
# assuming you have a 1 column dataframe called "df"
list <- c()
for(i in 1:nrow(df)){
list <- append(list, df[i,1])
}
View(list)
# This list is not a dataframe, it is a list of values
# You can filter a dataframe using "subset([Data], [Column] %in% list")
我们还可以将 data.frame 列一般地转换为简单的向量。 as.vector
是不够的,因为它保留了 data.frame 类和结构,所以我们还必须拉出第一个(也是唯一一个)元素:
df_column_object <- aframe[,2]
simple_column <- df_column_object[[1]]
到目前为止建议的所有解决方案都需要对列标题进行硬编码。这使得它们非泛型(想象将其应用于函数参数)。
或者,您当然可以先从列中读取列名,然后将它们插入到其他解决方案的代码中。
aframe[,"a2"]
,因为它能够同时用于数据帧和矩阵 &似乎得到了相同的结果 - 一个向量。[..., drop = F]
将始终返回一个数据框df$x
语法返回一个向量。我使用这种语法很长一段时间,但是当我不得不开始使用df['name']
或df[n]
来检索列时,当我试图将它们发送到期望向量的函数时遇到了问题。使用df[[n]]
或df[['x']]
清除一切。as.vector
似乎默默没有效果?这不应该返回一个向量还是明显失败?aframe[['a2']]
对于sf
对象非常有用,因为aframe[,"a2"]
将返回两列,因为包含几何列。