【问题标题】:Creating a new column by using another column values使用另一列值创建新列
【发布时间】:2020-06-03 18:29:07
【问题描述】:

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

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 &lt;- 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  

【问题讨论】:

  • 您的代码适用于我,没有四舍五入问题
  • 我认为这是打印格式问题。如果你检查tibble(A = c(7.933333, 16.016667, 24.533333, 34.700000), B = lead(A)) %&gt;% as.data.frame -&gt; out;out$B[-nrow(out)] == out$A[-1]# [1] TRUE TRUE TRUE
  • @akrun。你是对的!谢谢你。看起来这只是一个打印问题,而不是值的问题。
  • @JoshuaMire 我试过了。我的实际数据集有点复杂,因为我需要将 for 循环嵌套在另一个 for 循环中。
  • @Drew 如果要更改设置,请检查打印 tibble 输出的选项并指定要打印的小数点数

标签: r decimal rows names


【解决方案1】:

我们可以在dplyr 中使用leadmutate

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

【讨论】:

  • 谢谢阿克伦。我以前试过这个,但对我来说,我仍然遇到将 6 点小数自动转换为 5 的问题。这可能是因为我在 for 循环中应用了 mutate() 函数 到具有所有不同小数点的数据帧列表。
  • @Drew 你能展示你的实际代码吗?如果你检查这个例子,它是一个单一的数据集,mutatelead 值是从该数据集而不是从创建一个列不同的数据集。检查您的代码会很有趣
  • for(i in 1:length(slotfinal)){ slotfinal[[i]] %&gt;% mutate(Spin.next = lead(Time.of.bet)) }
  • @Drew 我尝试更新您的代码。但是,它仍然没有显示您提出的问题
  • @Drew 你能用dput 更新示例,以便我得到正确的结构
猜你喜欢
  • 2021-02-23
  • 2021-12-02
  • 2022-01-07
  • 2021-12-27
  • 2020-12-17
  • 1970-01-01
  • 2016-09-26
  • 2016-10-07
  • 2020-04-16
相关资源
最近更新 更多