将两个数据帧合并为一个新的(在条件下)

时间:2016-02-28 18:46:56

标签: r dataframe conditional-statements

我是R的新手,所以请耐心等待我。

我有两个数据帧:

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

我的目标是取代价值&#34;你好&#34;在df1中使用df2中的相应值(否则为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行的数据帧?其他类型的代码非常受欢迎!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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