2016-02-28 87 views
0

我是R新手,請耐心等待。將兩個數據幀合併成一個新條件

我有兩個dataframes:

df1 <- data.frame(name = c("name 1", "name 2", "name 3", "name 4"), 
       columnname = c("hello", "", "hello", "")) 

df2 <- data.frame(name = c("name 1", "name 2", "name 3"), 
       columnname = c(1, 2, 3)) 

它看起來像:

df1 
#name columnname 
#name 1  hello 
#name 2   
#name 3  hello 
#name 4  
df2 
#name  columnname 
#name 1   1 
#name 2   2 
#name 3   3 

我的目標是在DF2相應的值來替換值 「你好」 DF1(和NA其他) ,並創建一個新的數據框,df3。到目前爲止,我有以下代碼:

fun <- function(cat_df, ret_df, col_name) { 
ret_df[, col_name] <- ifelse(cat_df[, col_name] == "hello", ret_df[, col_name],"NA") 
return(ret_df) 
} 

df3 <- fun(df1, df2, col_name = "columnname") 

df3 
#name columnname 
#name 1   1 
#name 2   NA 
#name 3   3 
#name 4   NA 

但是,我有350列和3000行。所以我的問題是,我如何展開代碼來保存350列和3000行的數據框?其他類型的代碼非常受歡迎!

回答

1

因爲你想多個列的解決方案,我們先創建一個包含多個列的一些數據(你有可能會完成這件事自己....)

set.seed(4) 
nobs=5 
df1 <- data.frame(name=paste("name",1:nobs)) 
df1[,paste0("col",1:5)] <- sample(c("hello",""),5*nobs,T) 
# name col1 col2 col3 col4 col5 
# 1 name 1  hello  hello  
# 2 name 2 hello  hello    
# 3 name 3 hello  hello    
# 4 name 4 hello     hello 
# 5 name 5  hello hello    

df2 <- data.frame(name=paste("name",1:nobs)) 
df2[,paste0("col",1:5)] <- 1:nobs 
# name col1 col2 col3 col4 col5 
# 1 name 1 1 1 1 1 1 
# 2 name 2 2 2 2 2 2 
# 3 name 3 3 3 3 3 3 
# 4 name 4 4 4 4 4 4 
# 5 name 5 5 5 5 5 5 

然後我們創建

列名爲向量
mycols <- colnames(df1)[-1] 
names(mycols) <- mycols 

,使我們的結果

df3 <- data.frame(name=df1$name) 
df3[mycols]<- lapply(mycols,function(x){ 
    ifelse(df1[,x]=="hello",df2[,x],NA) 
}) 


    name col1 col2 col3 col4 col5 
1 name 1 NA 1 NA 1 NA 
2 name 2 2 NA 2 NA NA 
3 name 3 3 NA 3 NA NA 
4 name 4 4 NA NA NA 4 
5 name 5 NA 5 5 NA NA 
0

所以如果我的兩個數據幀具有的尺寸:

dim(df1) 
639 260 

and dim(df2) 
2273 260 

請問代碼,那麼看起來像:

set.seed(4) 
nobs=2273 
df1 <- data.frame(name=paste("name",1:nobs)) 
df1[,paste0("col",1:260)] <- sample(c("hello",""),260*nobs,T) 

df2 <- data.frame(name=paste("name",1:nobs)) 
df2[,paste0("col",1:260)] <- 1:nobs 

mycols <- colnames(df1)[-1] 
names(mycols) <- mycols 
df3 <- data.frame(name=df1$name) 
df3[mycols]<- lapply(mycols,function(x){ 
ifelse(df1[,x]=="hello",df2[,x],NA) 
}) 

df3 

+0

我收到以下錯誤:'[.data.frame'(df2,,x):undefined columns selected – Louis

+0

您的數據顯然有不同的行數。這使得給定的解決方案無效。 – Heroka

+0

好的,有沒有一種方法可以在代碼中截斷它? – Louis