簡體   English   中英

將 data.frame 列轉換為向量?

[英]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.matrixas.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM