Rのデータフレームに行を追加するにはどうすればよいですか?


129

Rでは、データフレームが既に初期化されている場合、どのように新しい行をデータフレームに追加しますか?

これまでのところ私はこれを持っています:

df <- data.frame("hi", "bye")
names(df) <- c("hello", "goodbye")

#I am trying to add "hola" and "ciao" as a new row
de <- data.frame("hola", "ciao")

merge(df, de) # Adds to the same row as new columns

# Unfortunately, I couldn't find an rbind() solution that wouldn't give me an error

どんな助けでもいただければ幸いです


1
名前deも割り当てます。names(de) <- c("hello","goodbye")そしてrbind
Khashaa

3
または1行でrbind(df, setNames(de, names(df)))
リッチスクリーベン、2015

2
これは本当に基本Rがで無残に失敗した領域であり、長い時間のために持っている:stackoverflow.com/questions/13599197/...
thelatemail

1
@thelatemailは同意しません。データフレームは、rの特別な構造です。一般的なdimnameと属性およびメソッドを含むリストのリスト。私はそれができないと非常に期待されていると思いrbind(data.frame(a = 1), data.frame(b = 2))ます…なぜあなたはしたいのですか?それが関係なくエラーをスローすることを願っています。これmergeは、ランダムby変数を使用するようなものです。そして、これは2015年です、誰もが設定しませんoptions(stringsAsFactors = FALSE)か?
2015

1
@rawr-確かに、異なる名前をバインドするべきではありませんが、Rは名前なしから名前なしへのバインド、名前を同じ次元での名前へのバインド、または新しいデータをバインドして新しい因子レベルを組み込むことは処理できません。それが弱点だと思います。特に、バインドされた繰り返し名とすべてのNA名を処理できる場合。また、設定stringsAsFactors=FALSEは簡単な修正ですが、他の人が異なるように設定する予定のデフォルトを変更すると、1日が台無しになる可能性があります。
thelatemail 2015

回答:


131

@Khashaaと@Richard Scrivenがコメントで指摘しているように、追加するすべてのデータフレームに一貫した列名を設定する必要があります。

したがって、2番目のデータフレームの列名を明示的に宣言してから、を使用する必要がありdeますrbind()。最初のデータフレームの列名のみを設定しますdf

df<-data.frame("hi","bye")
names(df)<-c("hello","goodbye")

de<-data.frame("hola","ciao")
names(de)<-c("hello","goodbye")

newdf <- rbind(df, de)

ありがとう!2番目のデータフレームが宣言されていないが、代わりに各値を新しい行に追加したい場合に変数として格納されている場合、これを修正する方法はありますか?
Rilcon42 2015

8
試してみてください:newdf<-rbind(df, data.frame(hello="hola", goodbye="ciao"))または変数と一緒に:newdf<-rbind(df, data.frame(hello=var1, goodbye=var2))
Parfait

108

簡単にしましょう:

df[nrow(df) + 1,] = c("v1","v2")

9
これにより、混合データタイプ(一部の文字列、一部の数値)で新しい行を追加しようとすると問題が発生します。このような場合、数値も文字列に変換されます。回避策の一つは、別途下記(3列があると仮定した場合)のようなものが値を追加することです。df[nrow(df) + 1, 1:2] = c("v1", "v2")そしてdf[nrow(df), 3] = 100しかし、まだそれは、新しい行を追加することについての良い点です。したがって、+ 1
スチューデントソウル

17
または、「c」の代わりに「list」を使用します。
イッセンデボーア2017

いい考えですが、最初の位置に新しい行を挿入または追加したい場合はどうすればよいですか?
ダーウィンPC

1
data.tableでこれを試しましたが、nrow + 1が範囲外であることを示しています。
Herman Toothrot '17年

1
@アラニはすでにで答えがありlist()ます。編集を元に戻しました。
M--

41

または、@ MatheusAraujoに触発されて:

df[nrow(df) + 1,] = list("v1","v2")

これにより、混合データ型が可能になります。


24

今ありますadd_row()から、tibbleまたはtidyverseパッケージ。

library(tidyverse)
df %>% add_row(hello = "hola", goodbye = "ciao")

指定されていない列はを取得しNAます。


あなたが整頓された哲学に固執するならば、私はこのアプローチが好きでした。それ以外の場合、基本的なR構文は、パッケージをインポートする権限がない環境にいるときに役立つサバイバルスキルです。私は特にして、プレーンRの構文を使用して、答えようrbindas.matrix 下に
パブロAdames

17

混合データ型をより適切に処理するため、list代わりに私は好きcです。元の投稿者の質問に列を追加します。

#Create an empty data frame
df <- data.frame(hello=character(), goodbye=character(), volume=double())
de <- list(hello="hi", goodbye="bye", volume=3.0)
df = rbind(df,de, stringsAsFactors=FALSE)
de <- list(hello="hola", goodbye="ciao", volume=13.1)
df = rbind(df,de, stringsAsFactors=FALSE)

文字列/要素の変換が重要な場合は、追加の制御が必要になることに注意してください。

または、MatheusAraujo / Ytsen de Boerのソリューションで元の変数を使用します。

df[nrow(df) + 1,] = list(hello="hallo",goodbye="auf wiedersehen", volume=20.2)

このソリューションは、データフレームに既存のデータがない限り、文字列ではうまく機能しないことに注意してください。


場合hellogoodbyeで、文字でありdf、次の操作を行うことができます。リストで名前を使用する必要はありません。df <- data.frame(hello = "hi", goodbye = "bye", volume = 1,stringsAsFactors = FALSE); rbind(df, list("hola", "ciao", 100))
jazzurro

11

それほどエレガントではありませんが、

data.frame(rbind(as.matrix(df), as.matrix(de)))

rbind関数のドキュメントから:

以下のためにrbind列名、適切な名前の最初の引数から取得されます:行列のためのCOLNAMES ...


このソリューションは、追加する列を指定する必要なく機能します。これは、大規模なデータセットでのアプリケーションに最適です
Phil_T

1

stringsAsFactors=FALSEデータフレームを作成するときに追加する必要があります。

> df <- data.frame("hello"= character(0), "goodbye"=character(0))
> df
[1] hello   goodbye
<0 rows> (or 0-length row.names)
> df[nrow(df) + 1,] = list("hi","bye")
Warning messages:
1: In `[<-.factor`(`*tmp*`, iseq, value = "hi") :
  invalid factor level, NA generated
2: In `[<-.factor`(`*tmp*`, iseq, value = "bye") :
  invalid factor level, NA generated
> df
  hello goodbye
1  <NA>    <NA>
> 

> df <- data.frame("hello"= character(0), "goodbye"=character(0), stringsAsFactors=FALSE)
> df
[1] hello   goodbye
<0 rows> (or 0-length row.names)
> df[nrow(df) + 1,] = list("hi","bye")
> df[nrow(df) + 1,] = list("hola","ciao")
> df[nrow(df) + 1,] = list(hello="hallo",goodbye="auf wiedersehen")
> df
  hello         goodbye
1    hi             bye
2  hola            ciao
3 hallo auf wiedersehen
> 

1

stringsAsFactors=FALSEデータフレームを作成するときに指定することを確認します 。

> rm(list=ls())
> trigonometry <- data.frame(character(0), numeric(0), stringsAsFactors=FALSE)
> colnames(trigonometry) <- c("theta", "sin.theta")
> trigonometry
[1] theta     sin.theta
<0 rows> (or 0-length row.names)
> trigonometry[nrow(trigonometry) + 1, ] <- c("0", sin(0))
> trigonometry[nrow(trigonometry) + 1, ] <- c("pi/2", sin(pi/2))
> trigonometry
  theta sin.theta
1     0         0
2  pi/2         1
> typeof(trigonometry)
[1] "list"
> class(trigonometry)
[1] "data.frame"

stringsAsFactors=FALSEデータフレームの作成時に使用しないと、新しい行を追加しようとすると次のエラーが発生します。

> trigonometry[nrow(trigonometry) + 1, ] <- c("0", sin(0))
Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = "0") :
  invalid factor level, NA generated

0

2つのデータフレームが同じ列と型を共有していることがわかっている場合、1つのデータフレームから別のデータフレームにレコードを追加する簡単な方法があります。1行を追加するxxyyちょうど次の手順を実行しiているi中番目の行をxx

yy[nrow(yy)+1,] <- xx[i,]

そのような単純な。厄介なバインドはありません。あなたは、すべての追加する必要がある場合xxにはyy、そのいずれかのループを呼び出すか、Rのシーケンス能力を利用して次の操作を行います。

zz[(nrow(zz)+1):(nrow(zz)+nrow(yy)),] <- yy[1:nrow(yy),]

0

空のデータフレームを作成してループにコンテンツを追加する場合は、次の方法が役立ちます。

# Number of students in class
student.count <- 36

# Gather data about the students
student.age <- sample(14:17, size = student.count, replace = TRUE)
student.gender <- sample(c('male', 'female'), size = student.count, replace = TRUE)
student.marks <- sample(46:97, size = student.count, replace = TRUE)

# Create empty data frame
student.data <- data.frame()

# Populate the data frame using a for loop
for (i in 1 : student.count) {
    # Get the row data
    age <- student.age[i]
    gender <- student.gender[i]
    marks <- student.marks[i]

    # Populate the row
    new.row <- data.frame(age = age, gender = gender, marks = marks)

    # Add the row
    student.data <- rbind(student.data, new.row)
}

# Print the data frame
student.data

それが役に立てば幸い :)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.