R 将函数应用于数据帧列表中的列并附加结果

R 将函数应用于数据帧列表中的列并附加结果,r,R,我想对数据帧列表应用一个函数。该函数从每个数据帧的两列中获取元素并将其添加,然后将输出添加到新列中的每个数据帧 创建虚拟数据: df.1 <- data.frame(data=cbind(rnorm(5, 0), rnorm(5, 2), rnorm(5, 5))) df.2 <- data.frame(data=cbind(rnorm(5, 0), rnorm(5, 2), rnorm(5, 5))) names(df.1) <- c("a", "b", "c") name

我想对数据帧列表应用一个函数。该函数从每个数据帧的两列中获取元素并将其添加,然后将输出添加到新列中的每个数据帧

创建虚拟数据:

df.1 <- data.frame(data=cbind(rnorm(5, 0), rnorm(5, 2), rnorm(5, 5)))
df.2 <- data.frame(data=cbind(rnorm(5, 0), rnorm(5, 2), rnorm(5, 5)))

names(df.1) <- c("a", "b", "c")
names(df.2) <- c("a", "b", "c")

ls.1<- list(df.1,df.2)
names(ls.1) <- c("cat", "dog")
ls.1
我想做什么的伪代码:

 my.fun <- function(b, c) {
  out.put <- b + c
  ls.1[i]$d <- out.put
}

我认为使用mapply或类似的东西应该很容易实现,但我无法理解….

lappy
您在每个列表项上的函数。函数应添加两列,然后返回更改的对象:

my.fun <- function(data,x,y,out) {data[out] <- data[[x]] + data[[y]]; data}
lapply(ls.1, my.fun, x="b", y="c", out="d")

#$cat
#           a         b        c        d
#1 -0.3762835 0.8775672 3.599283 4.476851
#2  1.4728001 2.2384841 3.093956 5.332440
#...
#
#$dog
#           a         b        c        d
#1 -0.7669203 2.8219880 4.284088 7.106076
#2  0.4413280 1.1619882 4.440192 5.602180
#...

my.fun
lappy
在这里很好用。注意这里需要一个
return(x)
,否则我们将只返回新的向量

res <- lapply(ls.1, function(x){
 x$d <- x$b + x$c
 return(x)
})

res这里有一个使用for循环的替代解决方案

for (e in  names(ls.1)) {
   ls.1[[e]]$d <- ls.1[[e]]$b + ls.1[[e]]$c
}

$cat
           a           b        c        d
1  1.2720987  2.03251108 4.395936 6.428447
2  0.1048982  1.47652374 3.556955 5.033479
3  0.1332581  2.97334172 5.262912 8.236254
4  0.8064055  2.44649336 6.605434 9.051927
5 -1.5200194 -0.08463335 4.279925 4.195292

$dog
            a        b        c         d
1  0.73350259 1.133349 5.223977  6.357326
2  0.40957903 1.431519 5.332924  6.764442
3 -0.92179742 3.778318 6.924693 10.703011
4  1.92143657 1.055262 4.318544  5.373806
5 -0.07847994 2.045227 6.311894  8.357121
for(名称中的e(ls.1)){

ls.1[[e]]$d显示的预期输出是否正确?无法计算两个列表中具有不同值的列
b
c
如何在两个列表中给出相同的
d
。@RonakShah,我的错误,$dog$d不正确,d应该等于b+c.ahhh!a FOR R中的循环!!!:((开玩笑,它确实有效,但请记住,矢量化等一直是首选)这让我保持了理智!谢谢。我从来没有想过像这样使用lapply!。
res <- lapply(ls.1, function(x){
 x$d <- x$b + x$c
 return(x)
})
for (e in  names(ls.1)) {
   ls.1[[e]]$d <- ls.1[[e]]$b + ls.1[[e]]$c
}

$cat
           a           b        c        d
1  1.2720987  2.03251108 4.395936 6.428447
2  0.1048982  1.47652374 3.556955 5.033479
3  0.1332581  2.97334172 5.262912 8.236254
4  0.8064055  2.44649336 6.605434 9.051927
5 -1.5200194 -0.08463335 4.279925 4.195292

$dog
            a        b        c         d
1  0.73350259 1.133349 5.223977  6.357326
2  0.40957903 1.431519 5.332924  6.764442
3 -0.92179742 3.778318 6.924693 10.703011
4  1.92143657 1.055262 4.318544  5.373806
5 -0.07847994 2.045227 6.311894  8.357121