使用具有相同列名的不同数据帧的函数

时间:2015-07-04 00:06:06

标签: r dataframe

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

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)

如果两个数据帧的列名相同,我需要编写一个将df1的值分配给df2的函数。函数的结构应如下所示:

[1] 1 2 3 4

输出应如下所示:

StandardAnalyzer

不幸的是我自己找不到解决方案。我有办法怎样做吗?非常感谢你提前!

3 个答案:

答案 0 :(得分:3)

  

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

你确定需要一个功能吗?

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

df2[,names_in_common] <- df1[,names_in_common]

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

答案 2 :(得分:1)

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

相反,你可以简单地使用列名称本身作为参数来调用fun(),而不是NAs的向量,它们在函数内部并没有用处。换句话说,呼叫变为

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