【问题标题】:Merging two dataframes into a new (on a condition)将两个数据帧合并成一个新的(在一个条件下)
【发布时间】:2016-02-28 18:46:55
【问题描述】:

我是 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

我的目标是将 df1 中的值“hello”替换为 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 行的数据框?其他类型的代码非常欢迎!

【问题讨论】:

    标签: r dataframe conditional-statements


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      因此,如果我的两个数据框的尺寸为:

      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
      

      ?

      【讨论】:

      • 我收到以下错误:[.data.frame(df2, , x) 中的错误:选择了未定义的列
      • 您的数据有明显不同的行数。这使得给定的解决方案无效。
      • 好的,有没有办法可以在代码中截断它?
      • 实际上删除剩余的列是行不通的,因为某些值是有序的并且需要匹配。如果这有意义
      • 这毫无意义。您最初的问题暗示了两个相同尺寸的数据框。请更新您的问题/示例脚本应如何处理不等尺寸(例如 3 行和 7 行)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      相关资源
      最近更新 更多