【问题标题】:Substraction between pairs of lines in RR中的线对之间的减法
【发布时间】:2021-12-07 06:00:30
【问题描述】:

我一直在尝试向我的数据框中添加一个新列,这是由于每个“子数据框”(每个“id_n”)的行对减去一列的值。

我的数据框如下所示:

dput(df[1:30,c(2,5,6,9,14,15)])

结构(列表(gen_spe = c(“holo_ads”,“holo_ads”,“holo_ads”, “holo_ads”、“holo_ads”、“holo_ads”、“holo_ads”、“holo_ads”、“holo_ads”、 “holo_ads”、“holo_ads”、“holo_ads”、“holo_ads”、“holo_ads”、“holo_ads”、 “holo_ads”、“holo_ads”、“holo_ads”、“holo_ads”、“holo_ads”、“holo_ads”、 “holo_ads”、“holo_ads”、“holo_ads”、“holo_ads”、“holo_ads”、“holo_ads”、 "holo_ads", "holo_ads", "holo_ads"), ori = c("guad", "guad", “瓜德”、“瓜德”、“瓜德”、“瓜德”、“瓜德”、“瓜德”、“瓜德”、“瓜德”、 “瓜德”、“瓜德”、“瓜德”、“瓜德”、“瓜德”、“瓜德”、“瓜德”、“瓜德”、 “瓜德”、“瓜德”、“瓜德”、“瓜德”、“瓜德”、“瓜德”、“瓜德”、“瓜德”、 “瓜德”,“瓜德”,“瓜德”,“瓜德”),spe = c(“广告”,“广告”,“广告”, “广告”、“广告”、“广告”、“广告”、“广告”、“广告”、“广告”、“广告”、“广告”、 “广告”、“广告”、“广告”、“广告”、“广告”、“广告”、“广告”、“广告”、“广告”、 “广告”、“广告”、“广告”、“广告”、“广告”、“广告”、“广告”、“广告”、“广告” ),id_n = c(“1_1”,“1_1”,“1_1”,“1_1”,“1_10”,“1_10”,“1_10”, “1_10”、“1_11”、“1_11”、“1_11”、“1_11”、“1_12”、“1_12”、“1_12”、 “1_12”、“1_13”、“1_13”、“1_13”、“1_13”、“1_14”、“1_14”、“1_14”、 “1_15”、“1_15”、“1_15”、“1_16”、“1_16”、“1_16”、“1_16”),npu = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4),duper = c(0.00997, 0.01002, 0.01213, 不适用, 0.01049, 0.01024, 0.01292, 不适用, 0.01054, 0.01009, 0.01424, 不适用, 0.01088, 0.01027, 0.01444, 不适用, 0.0102, 0.00995, 0.01165, 不适用, 0.01079, 0.01047, 不适用, 0.01061, 0.01129, 不适用, 0.01038, 0.0102, 0.01317, NA)), row.names = c(NA, 30L), class= "data.frame")

所以,我们有类似的东西:

id_n <- c("1_1","1_1","1_1","1_1","2_1","2_2","2_3","2_4","3_1","3_2")
duper <- c("0.00997","0.01002","0.01213", "NA", "0.01024", "0.01024", "0.01258", "NA", "0.01045", "0.01020")
npu <- c("1", "2", "3", "4", "1", "2", "3", "4", "1", "2")
x <- data.frame(id_n, duper, npu)

我希望 R 给我一个新列,对应于每个 id_n 列 'duper' 2 减去 2 的值。

例如,对于 id_n = 1_1 :0.01002-0.00997; 0.01213-0.01002. 对于 id_n = 1_2 :0.01024-0.01024; 0.01258-0.01024. 对于 id_n = 1_3 :0.01061-0.01047 以此类推。

我可以制作一个“子数据帧”列表,然后我想在上面应用一个函数,但我不知道如何让 R 来计算这个。 'npu' 列可用作每个 id_n 的值从 1 到 ...。

你有什么想法吗?

非常感谢,

海洋。

【问题讨论】:

  • 请不要发布数据或代码的照片!如果您这样做,愿意帮助您的人将不得不输入所有这些文本。而是提供minimal reproducible example这里是a good overview on how to ask a good question
  • 请提供 dput(head(name of your dataset)) 以帮助您
  • 对不起,我添加了一些信息和简单的代码来解释我尝试做的事情。我希望这很好!

标签: r list dataframe


【解决方案1】:

类似这样的东西(使用tidyverse 库):

install.packages("tidyverse")
library(tidyverse)

x$duper <- as.numeric(x$duper)

x %>%
  group_by(id_n) %>%
  mutate(new_col = duper - lag(duper))

返回这个结果:

# A tibble: 10 x 4
# Groups:   id_n [7]
   id_n     duper npu      new_col
   <chr>    <dbl> <chr>      <dbl>
 1 1_1    0.00997 1     NA        
 2 1_1    0.0100  2      0.0000500
 3 1_1    0.0121  3      0.00211  
 4 1_1   NA       4     NA        
 5 2_1    0.0102  1     NA        
 6 2_2    0.0102  2     NA        
 7 2_3    0.0126  3     NA        
 8 2_4   NA       4     NA        
 9 3_1    0.0104  1     NA        
10 3_2    0.0102  2     NA 

【讨论】:

  • 谢谢丹尼沙福宁!对于整个数据框,我必须这样写:df &lt;- df %&gt;% group_by(id_n) %&gt;% mutate(new_col = duper - lag(duper))
猜你喜欢
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多