转换data.frame列到向量?

我有一个数据框架,如:

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或其他语言有关会有帮助!)

500708 次浏览

我将尝试在不犯任何错误的情况下解释这一点,但我打赌这将在评论中引起一两个澄清。

数据帧是一个列表。当你使用列的名称和[来子集一个数据帧时,你得到的是一个子表(或一个子数据帧)。如果你想要实际的原子列,你可以使用[[,或者(对我来说)你可以使用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
a2
1  6
2  7
3  8
4  9
5 10
R>

你可以使用$提取:

class(aframe$a1)
[1] "numeric"

或者双方括号:

class(aframe[["a1"]])
[1] "numeric"

如果你只使用提取操作符,它就可以工作。默认情况下,[]设置选项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运行。表,然后你想从中提取一列作为向量

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列表中是否有值%。

我已经手动创建了一个1列的数据帧,导出到Excel中,我将添加“”,在每个元素周围,粘贴到R: list <- c(“el1”,“el2”,…),通常后面跟着FilteredData <-子集(数据,列%在% list)。

在搜索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")
as.vector(unlist(aframe['a2']))

我们还可以将data.frame列一般地转换为简单的向量。as.vector是不够的,因为它保留了data.frame类和结构,所以我们还必须取出第一个(也是唯一的)元素:

df_column_object <- aframe[,2]
simple_column <- df_column_object[[1]]

到目前为止建议的所有解决方案都需要硬编码列标题。这使得它们是非泛型的(想象一下将此应用于函数参数)。

当然,您也可以先从列中读取列名,然后将它们插入到其他解决方案的代码中。

另一个选项是使用as.matrixas.vector。这可以用于一列,但如果您想将所有列转换为一个向量,也可以这样做。下面是一个可重复的例子,首先将一列转换为一个向量,然后将完整的数据帧转换为一个向量:

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)


# Convert one column to vector
avector <- as.vector(as.matrix(aframe[,"a2"]))
class(avector)
#> [1] "numeric"
avector
#> [1]  6  7  8  9 10


# Convert all columns to one vector
avector <- as.vector(as.matrix(aframe))
class(avector)
#> [1] "numeric"
avector
#>  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15

创建于2022-08-27,包含reprex v2.0.2