我有一个数据帧,例如:
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或其他语言相关会有所帮助!)
我将尝试在不犯任何错误的情况下解释这一点,但我打赌这将吸引评论中的一两个澄清。
数据帧是一个列表。当您使用列名和
[
设置数据框子集时,您得到的是一个子列表(或子数据框)。如果需要实际的原子列,可以使用
[[
,或者(对我来说)有点困惑的是,可以使用
aframe[,2]
,它返回一个向量,而不是一个子列表。
所以试着运行这个序列,也许事情会变得更清楚:
avector <- as.vector(aframe['a2'])
class(avector)
avector <- aframe[['a2']]
class(avector)
avector <- aframe[,2]
class(avector)
您不需要
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
R>
您可以使用
$
提取:
class(aframe$a1)
[1] "numeric"
或双方括号:
class(aframe[["a1"]])
[1] "numeric"
如果您只使用extract运算符,它将会工作。默认情况下,[]设置选项
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"
使用'[[‘运算符的另一个优点是,它同时适用于data.frame和data.table。因此,如果函数必须同时为data.frame和data.table运行,并且您希望从中提取一列作为向量,那么
data[["column_name"]]
是最好的。
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"
现在有一种使用
dplyr
来完成此操作的简单方法。
dplyr::pull(aframe, a2)
你可以试试这样的东西-
as.vector(unlist(aframe$a2))
我使用列表来过滤数据帧,无论它们在%a列表中是否有值%。
在粘贴到R: list <- c("el1","el2",...)之前,我一直在手动创建列表,方法是将1列数据框导出到Excel中,在每个元素周围添加“”。其后面通常是FilteredData <-子集(数据,%列表中的列%)。
在搜索了stackoverflow之后,没有找到一种直观的方法将1列数据帧转换为列表,现在我发布了我的第一篇stackoverflow贡献:
# assuming you have a 1 column dataframe called "df"
list <- c()
for(i in 1:nrow(df)){