DS2 уже содержит NA. Я хочу провести различие между «уже есть» NA и NA, которые генерируются заливкой.

library(plyr)
l <- LETTERS[]
ds1 <- data.frame(a=l[1:3],b=l[5:7],c=l[7:9],d=l[10:12],stringsAsFactors = F)
ds2 <- data.frame(a=NA,b=l[23], c=l[22],stringsAsFactors = F)

rbind.fill(ds1,ds2)

Дает :

     a b c    d
1    A E G    J
2    B F H    K
3    C G I    L
4 <NA> W V <NA>

Я хочу чтобы:

     a b c    d
1    A E G    J
2    B F H    K
3    C G I    L
4 <NA> W V  foobar

Мне нужно общее решение, чтобы установить конкретное «значение заполнения» при rbinding данных кадров.

Я знаю, что мог бы различать НС вот так:

ds2[is.na(ds2)] <- "alreadyFooBar"
rbind.fill(ds1,ds2)

              a b c    d
1             A E G    J
2             B F H    K
3             C G I    L
4 alreadyFooBar W V <NA>

Есть ли возможность наоборот?

0
Andre Elrico 3 Апр 2017 в 16:45

2 ответа

Лучший ответ

Я думаю, что это должно получить вам то, что вы ищете:

library(plyr)
library(dplyr)
l <- LETTERS[]
ds1 <- data.frame(a=l[1:3],b=l[5:7],c=l[7:9],d=l[10:12],],stringsAsFactors = F)
ds2 <- data.frame(a=NA,b=l[23], c=l[22],stringsAsFactors = F)

NewCols <- setdiff(colnames(ds1),colnames(ds2))
ds2[NewCols] <- "fooBar"
rbind.fill(ds1,ds2)

Дает :

     a b c      d
1    A E G      J
2    B F H      K
3    C G I      L
4 <NA> W V fooBar
1
Ian Wesley 4 Апр 2017 в 04:24

Спасибо. Я создал эту функцию, на которую я могу положиться в будущем. Даже на обоих входах могут отсутствовать столбцы

fast.rbind <- function(x,y,value=NA){
    x[setdiff(colnames(y),colnames(x))] <- value

    y[setdiff(colnames(x),colnames(y))] <- value

    return(rbind(x,y))
}

x <- data.frame(a=l[1:3],b=l[5:7],c=l[7:9],d=l[10:12],stringsAsFactors = F)
y <- data.frame(a=NA, z=l[22],stringsAsFactors = F)
fast.rbind(x,y,"foobar")
0
Andre Elrico 4 Апр 2017 в 13:58