[英]Convert data.frame column to a vector?
我有一個 dataframe 例如:
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)
現在有一種簡單的方法可以使用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>
你可以試試這樣的 -
as.vector(unlist(aframe$a2))
使用 '[[' 運算符的另一個優點是它同時適用於 data.frame 和 data.table。 因此,如果 function 必須為 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 列 dataframe 導出到 Excel 來手動創建列表,在其中我將在每個元素周圍添加“”,然后粘貼到 Rel 中,然后再粘貼到 Rel:其次是 FilteredData <- 子集(數據,列 %in% 列表)。
在搜索了 stackoverflow 並沒有找到將 1 列 dataframe 轉換為列表的直觀方法后,我現在發布我的第一個 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 class 和結構,所以我們還必須拉出第一個(也是唯一一個)元素:
df_column_object <- aframe[,2]
simple_column <- df_column_object[[1]]
到目前為止建議的所有解決方案都需要對列標題進行硬編碼。 這使得它們非泛型(想象將其應用於 function 參數)。
或者,您當然可以先從列中讀取列名,然后將它們插入到其他解決方案的代碼中。
另一種選擇是將as.matrix
與as.vector
一起使用。 這可以針對一列完成,但如果要將所有列轉換為一個向量,也可以這樣做。 這是一個可重現的示例,首先將一列轉換為向量,然后將完整的 dataframe 轉換為一個向量:
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
使用reprex v2.0.2創建於 2022-08-27
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.