web-dev-qa-db-ja.com

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または他の何らかの言語に関連することは助けになるでしょう!)

128
Dolan Antenucci

私は間違いを犯さずにこれを説明しようとしていますが、私はこれが説明の中で1つまたは2つの説明を引き付けると確信しています。

データフレームはリストです。列の名前と[を使用してデータフレームをサブセット化すると、サブリスト(またはサブデータフレーム)になります。実際のアトミック列が必要な場合は、[[を使用するか、(混乱を招くように)サブリストではなくベクトルを返すaframe[,2]を使用できます。

だから、このシーケンスを実行してみて、多分物事が明確になります:

avector <- as.vector(aframe['a2'])
class(avector) 

avector <- aframe[['a2']]
class(avector)

avector <- aframe[,2]
class(avector)
177
joran

$抽出を使うことができます:

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

二重角かっこ:

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

as.vector()は必要ありませんが、正しい索引付けは必要です。avector <- aframe[ , "a2"]

もう1つ注意すべきことは、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> 
19

dplyrを使ってこれを行う簡単な方法があります。

dplyr::pull(aframe, a2)
17
Andrew Brēza

'[['演算子を使用するもう1つの利点は、data.frameとdata.tableの両方で機能することです。そのため、関数をdata.frameとdata.tableの両方に対して実行する必要があり、その列からベクトルとして抽出したい場合は、

data[["column_name"]] 

最高です。

8
joel.wilson

あなたはこのようなことを試すことができます -

as.vector(unlist(aframe$a2))
5
Vaibhav Sharma

抽出演算子を使用するだけでうまくいきます。デフォルトでは、[]はオプション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"
4
Ari B. Friedman
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"
2
shubham ranjan

リストを使用して、リスト内に%%の値があるかどうかによってデータフレームをフィルタリングします。

Rに貼り付ける前に、各要素の周囲に ""を追加する1列のデータフレームをExcelにエクスポートして手動でリストを作成していました。list < - c( "el1"、 "el2"、...) FilteredData < - サブセット(Data、%listのColumn%)が後に続きます。

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")
1
Adrian DSouza