在多个数据帧上使用if-else的R for循环

在多个数据帧上使用if-else的R for循环,r,if-statement,R,If Statement,提前问候并感谢您的帮助 我有许多数据框,类似于下面的数据框 df1 数据帧 name other 1 sam pro 2 dad mo1 3 mom Bxxx 框架3 name otherinfo 1 jus A 2 do 7 3 r pro B 4 sir B 5 real na 6 pete yes 嗅框 name information 1 al

提前问候并感谢您的帮助 我有许多数据框,类似于下面的数据框

df1

数据帧

  name other
1  sam   pro
2  dad   mo1
3  mom  Bxxx
框架3

   name otherinfo
1   jus         A
2    do         7
3 r pro         B
4   sir         B
5  real        na
6  pete       yes
嗅框

   name information
1  ally          x1
2   mom          B9
3 r pro         s3B
4   tom         Bd0
5 kelly          ot
6  jojo         who
7    na          11
我想:

  • 从dataframe“OLFrame”的“name”列中获取每个名称,并查看“df1”的“name”列中是否存在该名称
  • 如果“OLFrame”中的名称存在于“df1”中(如果不是“0”),则创建名为“df1”且包含“1”的列向量
  • 重复步骤1和2,但使用“dframe”和“frame3”
  • 创建一个名为“newOLFrame”的新数据帧,包括“OLFrame”和名为“df1”、“dframe”和“frame3”的新列
  • 期望的结果应该是

    纽沃尔框

       name information df1 dframe frame3
    1  ally          x1   0      0      0
    2   mom          B9   0      1      0
    3 r pro         s3B   0      0      1
    4   tom         Bd0   1      0      0
    5 kelly          ot   0      0      0
    6  jojo         who   0      0      0
    7    na          11   0      0      0
    
    我可以一次做一个(如下),但我有100多个文件要看

    newOLFrame<-OLFrame
    newOLFrame[,"pro1"]<-ifelse(newOLFrame$name %in% df12$name, 1, 0)
    

    newOLFrame考虑扩展链合并,首先构建一个数据帧列表,以迭代方式左键连接到OLFrame,然后在末尾使用
    Reduce
    进行链合并:

    df_list <- lapply(c("df1", "dframe", "frame3"), function(nm) {      
      df <- get(nm)
      df[[nm]] <- 1
    
      df <- merge(OLFrame, df[c("name", nm)], by="name", all.x=TRUE) 
      df[[nm]] = ifelse(is.na(df[[nm]]), 0, 1)
    
      return(df)
    })
    
    # MERGE ALL DFs
    final_df <- Reduce(function(x, y) merge(x, y, by=c("name", "information")), df_list)
    final_df
    #    name information df1 dframe frame3
    # 1  ally          x1   0      0      0
    # 2  jojo         who   0      0      0
    # 3 kelly          ot   0      0      0
    # 4   mom          B9   0      1      0
    # 5    na          11   0      0      0
    # 6 r pro         s3B   0      0      1
    # 7   tom         Bd0   1      0      0
    

    非常感谢。如果“name”列是两列“firstname”、“lastname”,那么应该如何调整代码?将name替换为df列选择和参数中的附加项。我这样做了,效果很好,谢谢。在大文件上,速度很慢;我们可以做些什么来加快速度吗。其给定的内存错误,除了减少环境中的文件量之外;还可以执行其他操作吗?data.frame(…,check.names=FALSE)中的错误:参数意味着不同的行数:91674、843779、52800来自不同文件的结果具有不同的长度,这阻碍了最终合并:“final_df
    df_list <- lapply(c("df1", "dframe", "frame3"), function(nm) {      
      df <- get(nm)
      df[[nm]] <- 1
    
      df <- merge(OLFrame, df[c("name", nm)], by="name", all.x=TRUE) 
      df[[nm]] = ifelse(is.na(df[[nm]]), 0, 1)
    
      return(df)
    })
    
    # MERGE ALL DFs
    final_df <- Reduce(function(x, y) merge(x, y, by=c("name", "information")), df_list)
    final_df
    #    name information df1 dframe frame3
    # 1  ally          x1   0      0      0
    # 2  jojo         who   0      0      0
    # 3 kelly          ot   0      0      0
    # 4   mom          B9   0      1      0
    # 5    na          11   0      0      0
    # 6 r pro         s3B   0      0      1
    # 7   tom         Bd0   1      0      0
    
    df_list <- lapply(c("df1", "dframe", "frame3"), function(nm) {
    
      df <- get(nm)
      df[[nm]] <- 1
    
      df <- merge(OLFrame, df[c("name", nm)], by="name", all.x=TRUE, sort=FALSE) 
      df[[nm]] = ifelse(is.na(df[[nm]]), 0, 1)
    
      df <- with(df, df[order(name, information),])        # ORDER DATA FRAME
      small_df <- setNames(as.data.frame(df[[nm]]), nm)    # SUBSET ONE COLUMN
    
      return(small_df)
    })
    
    # ORDER DATA FRAME
    OLFrame <- with(OLFrame, OLFrame[order(name, information),])
    
    final_df <- do.call(cbind, c(OLFrame, df_list))
    final_df
    
    #    name information df1 dframe frame3
    # 1  ally          x1   0      0      0
    # 2  jojo         who   0      0      0
    # 3 kelly          ot   0      0      0
    # 4   mom          B9   0      1      0
    # 5    na          11   0      0      0
    # 6 r pro         s3B   0      0      1
    # 7   tom         Bd0   1      0      0