2015-02-12 20 views
32

Trong R, làm thế nào để bạn thêm hàng mới vào một khung dữ liệu sau khi khung dữ liệu đã được khởi tạo?Thêm hàng vào dataframe

Cho đến nay tôi có điều này:

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 
#I couldnt find an rbind solution that wouldnt give me an error 

Bất kỳ ý tưởng?

+1

cũng chỉ định tên cho 'de'. 'tên (de) <- c (" hello "," lời tạm biệt ")' và 'rbind' – Khashaa

+2

Hoặc trong một dòng' rbind (df, setNames (de, tên (df))) ' –

+0

Đây thực sự là một khu vực cơ sở R thất bại thảm hại tại, và có một thời gian dài: http://stackoverflow.com/questions/13599197/rbind-data-frames-without-names – thelatemail

Trả lời

34

Giống như @Khashaa và @Richard Scriven chỉ ra trong nhận xét, bạn phải đặt cột nhất quán tên cho tất cả các khung dữ liệu bạn muốn nối thêm.

Do đó, bạn cần khai báo rõ ràng tên cột cho khung dữ liệu thứ hai, de, sau đó sử dụng rbind(). Bạn chỉ đặt tên cột cho khung dữ liệu đầu tiên, 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) 
+0

Cảm ơn! Bất kỳ ý tưởng làm thế nào để sửa lỗi này nếu tôi không có một dataframe thứ hai khai báo, nhưng thay vào đó có mỗi giá trị tôi muốn thêm vào một hàng mới được lưu trữ như là một biến? – Rilcon42

+3

Thử: 'newdf <-rbind (df, data.frame (hello =" hola ", goodbye =" ciao "))' HOẶC có biến: 'newdf <-rbind (df, data.frame (hello = var1, tạm biệt = var2)) ' – Parfait

5

Không khủng khiếp tao nhã, nhưng:

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

Từ tài liệu của rbind chức năng:

Đối rbind tên cột được lấy từ số đầu tiên với tên thích hợp: colnames cho một ma trận .. .

+0

Giải pháp này hoạt động mà không cần chỉ định các cột cần thêm, tốt hơn nhiều cho các ứng dụng trên các tập dữ liệu lớn –

19

Hãy làm cho nó đơn giản:

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

Điều này gây ra vấn đề khi cố gắng thêm hàng mới với các kiểu dữ liệu hỗn hợp (một số chuỗi, một số số). Trong trường hợp này, ngay cả các giá trị số được chuyển thành chuỗi. Một cách giải quyết là thêm các giá trị riêng biệt, giống như sau (giả sử có 3 cột): 'df [nrow (df) + 1, 1: 2] = c (" v1 "," v2 ")' và 'df [nrow (df), 3] = 100' Nhưng vẫn là một điểm tốt về việc thêm hàng mới. Vì vậy, +1 –

+4

Hoặc sử dụng "danh sách" thay vì "c". –

9

Hoặc, như lấy cảm hứng từ @MatheusAraujo:

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

này sẽ cho phép các loại dữ liệu hỗn hợp.

3

Tôi thích danh sách thay vì c vì nó xử lý các loại dữ liệu hỗn hợp tốt hơn. Thêm cột bổ sung vào câu hỏi của người đăng ban đầu:

#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) 

Lưu ý rằng cần phải có thêm điều khiển nếu chuyển đổi chuỗi/yếu tố là quan trọng.

Hoặc sử dụng các biến ban đầu với các giải pháp từ MatheusAraujo/Ytsen de Boer:

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

Lưu ý rằng giải pháp này không làm việc tốt với các dây trừ khi có dữ liệu hiện có trong dataframe.

Các vấn đề liên quan