【问题标题】:Function which uses different dataframes with same column names使用具有相同列名的不同数据框的函数
【发布时间】:2015-07-04 00:06:05
【问题描述】:

我有两个如下所示的数据框:

df1 <- data.frame(V1 = 1:4, V2 = rep(2, 4), V3 = 7:4)
df2 <- data.frame(V2 = rep(NA, 4), V1 = rep(NA, 4), V3 = rep(NA, 4))

如果两个数据框的列名相同,我需要编写一个函数,将 df1 的值分配给 df2。函数的结构应该是这样的:

fun <- function(x){
  if(# If the name of x is the same like the name of a column in df1)
    out <- df1$? # Here I need to assign df1$"x" somehow
    out
}

fun(df2$V1)

输出应如下所示:

[1] 1 2 3 4

不幸的是,我自己找不到解决方案。有没有办法我可以做到这一点?非常感谢您!

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我需要编写一个函数,将 df1 的值分配给 df2,如果 两个数据框的列名相同。

    你确定你需要一个函数吗?

    names_in_common <- intersect(names(df1),names(df2))
    
    df2[,names_in_common] <- df1[,names_in_common]
    

    【讨论】:

    • 两个答案的问题是我可能需要为数据帧的单个向量执行此操作,并且名称不会给我单个输入的名称。如果我尝试 names(df2$V1) 它返回“NULL”。有没有办法获得这个单一向量的名称?
    【解决方案2】:

    使用 Joachim Schork 的代码:

    names_in_common <- intersect(names(df1),names(df2))
    
    df2[,names_in_common] <- df1[,names_in_common]
    

    如果你想改变 df2 的单列:

    names_in_common <- intersect(names(df1), names(df2[, "V1", drop=FALSE]))
    
    df2[,names_in_common] <- df1[,names_in_common]
    

    【讨论】:

      【解决方案3】:

      这是不可能的,因为当您使用美元语法访问 data.frame 的列时,您会丢失列名。 fun() 无法确定作为参数传入的向量的列名。

      相反,您可以简单地调用fun(),使用列名本身作为参数,而不是 NA 的向量,这在函数内部没有用处且根本不使用。也就是说,调用变成了

      fun('V1');
      

      那么你可以编写如下函数:

      fun <- function(name) df1[[name]];
      

      演示:

      fun('V1');
      ## [1] 1 2 3 4
      

      虽然我现在想了想,你还是直接索引df1吧,因为这就是函数现在所做的全部:

      df1$V1;
      ## [1] 1 2 3 4
      

      重读您的问题,您说您想将列从df1 分配给df2,尽管您的示例代码没有这样做。假设您确实想在函数内部执行此分配,您可以这样做:

      fun <- function(name) df2[[name]] <<- df1[[name]];
      

      演示:

      fun('V1');
      df2;
      ##   V2 V1 V3
      ## 1 NA  1 NA
      ## 2 NA  2 NA
      ## 3 NA  3 NA
      ## 4 NA  4 NA
      

      这利用了superassignment operator &lt;&lt;-

      【讨论】:

      • 非常感谢所有回答问题的人!根据答案,我设法找到了解决方案。就像在 bgoldsts 解决方案中一样,我使用一个字符作为函数的输入,例如“V1”。
      猜你喜欢
      • 1970-01-01
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多