-17

欠損値のあるデータが与えられた場合、代入は、欠損値をいくつかの値で置き換えるプロセスです。目標は、NA で示される欠損値のある行を無視することです。このような行は、データのコンポーネントと見なされる可能性があるため、このプロセスはアイテム代入と呼ばれます。

入力

df1 <- data.frame(ID=c(1,2,5,6),V1=c(7,77,777,NA))
df2 <- data.frame(ID=c(1,3,5,6),V2=c(6,66,666,6666))
df3 <- data.frame(ID=c(1,3,5,6),V3=c(9,NA,999,9999))

または、欠損値が NA でマークされている CSV 形式

data.csv      data2.csv        data3.csv

ID V1         ID V2            ID V3
1  7          1  6             1  9
2  77         2  NA            2  NA
3  NA         3  66            3  NA
4  NA         4  NA            4  NA
5  777        5  666           5  999
6  NA         6  6666          6  9999

出力

期待される結果は

ID V1   V2   V3
1  7    6    9
5  777  666  999

ここでは、NA 値のない行だけが必要でした。

入力データを列 V1、V2、V3、および行に NA のない共通の列 ID とマージする方法は?


共通 ID を持ち、NA を持たない列をマージするための SQLDF を使用したソリューションの例

library(sqldf)
# Read in the data: with CSV, you can use read.csv or fread from data.table
df1 <- data.frame(ID=c(1,2,5,6),V1=c(7,77,777,NA))
df2 <- data.frame(ID=c(1,3,5,6),V2=c(6,66,666,6666))
df3 <- data.frame(ID=c(1,3,5,6),V3=c(9,NA,999,9999))
#
sqldf("SELECT a.ID, a.V1, b.V2, c.V3 FROM df1 a, df2 b, df3 c WHERE a.ID=b.ID AND b.ID=c.ID AND V1!='NA'")

結果として

   ID   V1  V2  V3
1   1    7   6   9
2   5  777 666 999
4

2 に答える 2

3

これはベースRのみのバージョンであり、マージがいくつあるかは関係ありません。データフレームがリストにあると仮定しますl-その形式のサンプルデータについては、Qへの編集を参照してください。

for(i in seq_along(l[-1])) {
    if(i == 1) {
        m <- merge(l[[i]], l[[i+1]])
    } else {
        m <- merge(m, l[[i+1]])
    }
}
m <- m[!apply(is.na(m), 1, any), ]

これにより、目的の出力が得られます

> m
  ID  V1  V2  V3
1  1   7   6   9
2  5 777 666 999

データを読み込むには、次のようなものが機能するはずです

l <- lapply(list.files(pattern = glob2rx("data*.csv")), read.table, 
            header = TRUE)

またはそれらが本当にCSVである場合

l <- lapply(list.files(pattern = glob2rx("data*.csv")), read.csv)

次に、上記のコードを使用して処理できます。

于 2011-08-10T16:55:48.113 に答える
2

この質問で細かく表示されている俳句の芸術形式を尊重して、私は次の答え/野蛮な推測を提供するつもりです:

library(reshape)
dats <- lapply( dir(), read.csv )
mgd <- merge_recurse( dats, by="ID" )
na.sel <- apply( mgd, 1, function(x) any(is.na(x)) )
mgd <- mgd[!na.sel,]

これは、実際にID==1が必要であることを前提としていることに注意してください。

ヒントをくれた@Jorisに感謝しmerge_recurseます。

于 2011-08-10T16:15:55.783 に答える