首页 > 解决方案 > 使用另一列值创建新列

问题描述

我有一个如下所示的数据集:

data <- data.frame(A = c(3.132324,12.3439085,3.34343,5.1239048,6.34323,3.342334,9.342343,134.132433,13.1234323,23.34323))

现在,我想使用 A 值创建一个新列 B,它基于 A 下一行的值。像这样:

      A          B
1    3.132324  12.343908
2   12.343908   3.343430
3    3.343430   5.123905
4    5.123905   6.343230
5    6.343230   3.342334
6    3.342334   9.342343
7    9.342343 134.132433
8  134.132433  13.123432
9   13.123432  23.343230
10  23.343230         NA

我试过使用这样的代码data$B <- c(tail(data$A, -1), NA)),但我得到的小数位数不正确(例如,6 个小数点的值变成 5 个小数点)。我希望 B 值完全遵循A 值,其中包括小数点。

我该怎么做呢?

更新

这显示了我在实际数据集中遇到的问题,即当我使用 mutate() 函数时 B 变圆,正如@akrun 建议的那样。

     A        B
1  7.933333 16.01667
2 16.016667 24.53333
3 24.533333 34.70000
4 34.700000       NA  

标签: rdecimalrowsnames

解决方案


我们可以使用leadwith mutateindplyr

library(dplyr)
data %>% 
     mutate(B = lead(A))
#           A          B
#1    3.132324  12.343908
#2   12.343908   3.343430
#3    3.343430   5.123905
#4    5.123905   6.343230
#5    6.343230   3.342334
#6    3.342334   9.342343
#7    9.342343 134.132433
#8  134.132433  13.123432
#9   13.123432  23.343230
#10  23.343230         NA

基于OP的代码,让我们尝试一下list

slotfinal <- list(data, data)
for(i in seq_along(slotfinal)) slotfinal[[i]] <- slotfinal[[i]] %>%
             mutate(B = lead(A))

slotfinal
#[[1]]
#            A          B
#1    3.132324  12.343908
#2   12.343908   3.343430
#3    3.343430   5.123905
#4    5.123905   6.343230
#5    6.343230   3.342334
#6    3.342334   9.342343
#7    9.342343 134.132433
#8  134.132433  13.123432
#9   13.123432  23.343230
#10  23.343230         NA

#[[2]]
#            A          B
#1    3.132324  12.343908
#2   12.343908   3.343430
#3    3.343430   5.123905
#4    5.123905   6.343230
#5    6.343230   3.342334
#6    3.342334   9.342343
#7    9.342343 134.132433
#8  134.132433  13.123432
#9   13.123432  23.343230
#10  23.343230         NA

推荐阅读