2015-04-14 40 views
22

Tôi có khung dữ liệu sau và đang cố hợp nhất hai cột thành một cột, trong khi thay thế NA bằng các giá trị số.Hợp nhất hai cột thành một trong R

ID A  B 
1  3  NA 
2  NA 2 
3  NA 4 
4  1  NA 

Kết quả tôi muốn là:

ID New 
1  3 
2  2 
3  4 
4  1 

Cảm ơn trước!

Trả lời

6

Bạn có thể thử

New <- do.call(pmax, c(df1[-1], na.rm=TRUE)) 

Hoặc

New <- df1[-1][cbind(1:nrow(df1),max.col(!is.na(df1[-1])))] 
d1 <- data.frame(ID=df1$ID, New) 
d1 
# ID New 
#1 1 3 
#2 2 2 
#3 3 4 
#4 4 1 
9

Bạn có thể sử dụng unite từ tidyr:

library(tidyr) 

df[is.na(df)] = '' 
unite(df, new, A:B, sep='') 
# ID new 
#1 1 3 
#2 2 2 
#3 3 4 
#4 4 1 
+2

Lưu ý rằng 'new' là một vector nhân vật ông re .. – Arun

+0

A: B có thể được thay thế bằng chỉ số cột như 1: 2. – Decula

11

Bạn cũng có thể làm: with(d,ifelse(is.na(A),B,A))

trong đód là khung dữ liệu của bạn.

+4

Chỉ hoạt động nếu NA là độc quyền hoặc trong một hoặc cột khác! Nhưng cách tiếp cận tốt cho trường hợp đặc biệt này! –

11

Một giải pháp rất đơn giản khác trong trường hợp này là sử dụng chức năng rowSums.

df$New<-rowSums(df[, c("A", "B")], na.rm=T) 
df<-df[, c("ID", "New")] 

Cập nhật: Cảm ơn @Artem Klevtsov vì đã đề cập rằng phương pháp này chỉ hoạt động với dữ liệu số.

+1

Chỉ hoạt động với dữ liệu số. –

+0

Cũng nên cẩn thận nếu cả hai cột "A" và "B" đều có NA thì 0 sẽ được trả về "Mới". Không phải là một vấn đề trong trường hợp thử nghiệm. – thisisrg

5

Giả sử A hoặc B có một NA, điều đó sẽ chỉ làm việc tốt:

# creating initial data frame (actually data.table in this case) 
library(data.table) 
x<- as.data.table(list(ID = c(1,2,3,4), A = c(3, NA, NA, 1), B = c(NA, 2, 4, NA))) 
x 
# ID A B 
#1: 1 3 NA 
#2: 2 NA 2 
#3: 3 NA 4 
#4: 4 1 NA 


#solution 
y[,New := na.omit(c(A,B)), by = ID][,c("A","B"):=NULL] 
y 
# ID New 
#1: 1 3 
#2: 2 2 
#3: 3 4 
#4: 4 1 
+2

đẹp! Ngoài ra, 'y [, Mới: = pmin (A, B, na.rm = TRUE)]' – Arun

6

Điều này có lẽ không tồn tại khi các câu trả lời được viết, nhưng kể từ khi tôi đến đây với cùng một câu hỏi và tìm thấy một giải pháp tốt hơn, ở đây nó là dành cho nhân viên của Google trong tương lai:

gì bạn muốn coalesce() chức năng từ dplyr là:

y <- c(1, 2, NA, NA, 5) 
z <- c(NA, NA, 3, 4, 5) 
coalesce(y, z) 

[1] 1 2 3 4 5 
Các vấn đề liên quan