2016-06-17 5 views
2

これは、元のデータフレームである:新しいデータフレームと、データフレーム内の特定の値を交換

> df = data.frame(name=c('a', 'b', 'c'), age = c(12, 23, 34), sex = c('boy', 'girl', 'boy')) 
> df 
    name age sex 
1 a 12 boy 
2 b 23 girl 
3 c 34 boy 

そして、このデータフレームは、私は変更する必要がある値が含まれています

> newdf = data.frame(name=c('a', 'c'), sex=c('girl', 'girl')) 
> newdf 
    name sex 
1 a girl 
2 c girl 

私がする必要がありますdfの値をnewdfの値に置き換えます。

期待される結果は次のようになります。

> expectedResult = data.frame(name=c('a', 'b', 'c'), age=c(12, 23, 34), sex=c('girl', 'girl', 'girl')) 
> expectedResult 
    name age sex 
1 a 12 girl 
2 b 23 girl 
3 c 34 girl 

私はsetcbindを使用してみましたが、うまくいきませんでした。

dplyrまたはdata.tableのソリューションが歓迎されています。 > 100列のデータフレームで動作するソリューションが必要です。

答えて

3

on「名前」に参加し、「i.sex」の値を「性別」に割り当てることができます。複数の列がある場合

library(data.table) 
setDT(df)[newdf, sex:= i.sex , on = 'name'] 
df 
#  name age sex 
#1: a 12 girl 
#2: b 23 girl 
#3: c 34 girl 

、 'newdf'

newdf = data.frame(name=c('a', 'c'), age = c(14, 22), sex=c('girl', 'girl')) 

変更する列のベクトルを作成し( 'NM1')を変化させることにより、例えば、on 'name' を参加、 mgetを使用してlisti.列を取得し、出力を「nm1」に割り当てます。ここで

nm1 <- c("sex", "age") 
setDT(df)[newdf, (nm1) := mget(paste0("i.", nm1)), on = 'name'] 
df 
# name age sex 
#1: a 14 girl 
#2: b 23 girl 
#3: c 22 girl 
+0

複数の列がある場合はどうなりますか? i.colのループを試しましたが、うまくいきませんでした。 – shawnl

+0

@shawni 'c( 'sex'、 'something'):= list(i.sex、i.something)' – akrun

+0

どうすれば 'i.col'のように動的にすることができますか? > 100列のデータフレームで動作するソリューションでなければなりません。 – shawnl

0

あなたがデータフレームのすべての異なる種類の間で交換のすべてのこれらの種類のために使用することができる機能は、次のように関数の引数がある

replace_frame_with <- function(dataframe1,dataframe2,vec){ 

myvector <- colnames(out) 
yourvector <- colnames(out2) 
out <- dataframe1[vec,] 
out2 <- dataframe2[vec,] 

if(ncols(out)>ncols(out2)){ 
    cols_to_exchange <- myvector[myvector==yourvector] 
    out[,cols_to_exchange] <- out2[,cols_to_exchange] 
    return(out) 
} 

if(ncols(out2)>ncols(out)){ 
    cols_to_exchange <- yourvector[yourvector==myvector] 
    out[,cols_to_exchange] <- out2[,cols_to_exchange] 
    return(out) 
} 

} 

です:

dataframe1 =データフレーム

の値を置き換えたいdataframe2 =最初の引数の値を置き換える際に値を使用するデータフレーム

vec =置き換えたくない行。

コードを読んで、ここにいくつか間違いがあるかもしれませんが、主なロジックは真です。私の機能に機械的なミスがある場合は、このロジックを自分の関数に適用することができます。私は少なくともその方法でお手伝いをすると思います。

ご覧のとおり、この機能は自動的に列と行に合わせて調整されますので、何の労力も必要ありません。

as.NA is.Naと他のNA fxnsを使用して、短い行のNAの行を記入することを忘れないでください。これは、Rプログラミングソフトウェアで組み込み関数を使用して行を調整する方法です上記の関数コードにこの関数を実装することができます。それはあなた次第です。

replace_frame_with(df,newdf,c(1,3)) 
関連する問題