2016-02-28 92 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