应用于将列添加到现有数据框

时间:2018-08-01 08:18:43

标签: 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")
names(df.2) <- c("a", "b", "c")

ls.1<- list(df.1,df.2)


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

返回一个新列表“ res”,其中包含一组未命名的数据帧(res [[1]],res [[2]]等)。

[[1]]
           a        b        c        d
1  2.2378686 3.640607 4.793172 8.433780
2 -0.4411046 3.690850 5.290814 8.981664
3 -1.1490879 3.081092 4.982820 8.063912
4 -0.3024211 1.929033 4.743569 6.672602
5  1.3658726 3.395564 2.800131 6.195695

[[2]]
           a        b        c         d
1  0.3452530 3.264709 7.384127 10.648836
2 -1.2031949 3.118633 4.840496  7.959129
3  0.6177369 1.119107 4.938917  6.058024
4 -1.0470713 1.942357 5.747748  7.690106
5  0.8732836 2.704501 5.805754  8.510254

我有兴趣在原始数据帧(df.1,df.2)中添加列。我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以命名列表元素,或使用tibble::lst来为您完成此操作:

ls.1<- list(df.1 = df.1,df.2 = df.2)
ls.2<- tibble::lst(df.1, df.2)

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

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

# $df.1
#            a         b        c        d
# 1  0.6782608 4.0774244 2.845351 6.922776
# 2  2.3620601 1.9395314 5.438832 7.378364
# 3 -0.5913838 2.0579972 4.312360 6.370357
# 4  0.5532147 0.8581389 5.867889 6.726027
# 5 -0.3251044 1.9838598 4.321008 6.304867
# 
# $df.2
#            a        b        c        d
# 1  1.9918131 3.195105 5.715858 8.910963
# 2  0.2525537 2.507358 5.040691 7.548050
# 3  0.5038298 3.112855 5.265974 8.378830
# 4  0.4873384 3.377182 5.685714 9.062896
# 5 -0.6539881 0.157948 5.407508 5.565456

要覆盖原始数据帧,可以在输出中使用list2env

答案 1 :(得分:0)

要添加列,您将不得不用ls.1覆盖res或手动将结果分配给原始数据。 df.1 <- res[[1]]。但是,有一百种方法可以给猫(双关语)蒙皮,还有其他更好的方法。