【问题标题】:Create a new column with a sum based on the value of three other columns根据其他三列的值创建一个总和的新列
【发布时间】:2015-04-08 04:03:36
【问题描述】:

我有一个数据框,我想根据三个不同列的信息创建另一列。我正在使用 R。

我想从 0 开始计数,并根据时间列以及项目和参与者信息在每个新单元格中添加 2。我希望每个参与者的每个项目的时间计数(以毫秒为单位)的开头都为 0。

df <- data.frame(Item=c(1,1,1,1,1,1,2,2,2,2,2,2),  
             Part=c(1,1,1,2,2,2,1,1,1,2,2,2), 
            Time=c(1234,1235,1236,345,346,347,1546,1547,1548,234,235,236))

   Item Part Time
1     1    1 1234
2     1    1 1235
3     1    1 1236
4     1    2  345
5     1    2  346
6     1    2  347
7     2    1 1546
8     2    1 1547
9     2    1 1548
10    2    2  234
11    2    2  235
12    2    2  236

使用新列,表格将类似于:

   Item Part Time NewColumn
1     1    1 1234         0
2     1    1 1235         2
3     1    1 1236         4
4     1    2  345         0
5     1    2  346         2
6     1    2  347         4
7     2    1 1546         0
8     2    1 1547         2
9     2    1 1548         4
10    2    2  234         0
11    2    2  235         2
12    2    2  236         4

非常感谢。

【问题讨论】:

  • 您能接受这个答案以便我们结束这个问题吗?

标签: r


【解决方案1】:

如果结构保持原样

library(dplyr)
result <- df %>% group_by(Part, Item) %>% mutate(NewColumn = seq (0,4,2))

我按ItemPart 分组并创建一个计数为0、2、4 的新列

   Item Part Time NewColumn
1     1    1 1234         0
2     1    1 1235         2
3     1    1 1236         4
4     1    2  345         0
5     1    2  346         2
6     1    2  347         4
7     2    1 1546         0
8     2    1 1547         2
9     2    1 1548         4
10    2    2  234         0
11    2    2  235         2
12    2    2  236         4

为了更灵活(如果每组超过 3 行),可以使用

result <- df %>% group_by(Part, Item) %>% mutate(NewColumn = 2* (row_number()-1))

这将生成序列 0、2、4、6、8、...的数字

【讨论】:

  • 非常感谢。是的,我有超过 3 行(更多),所以第二个答案将是最好的解决方案,但我收到一个错误:错误:找不到函数“%>%”。我也试过这个解决方案:dat[, csum := c(0,cumsum(Time-Time+2)), by=c("Part","Item")],因为我想要基于时间的计数,但我收到另一个错误:警告消息:1:在 [.data.table(df, , :=(NewCol, seq(0, nrow(df), 2)), by = list (项目,:RHS 1 的长度为 7(大于组 1 的大小 (3))。最后 4 个元素将被丢弃。
  • 它是dplyr 的链接运算符,因此对于第二种解决方案,您还必须使用library(dplyr) 加载库。如果您之前没有安装,请使用install.packages("dplyr")
  • 对不起。我确信我已经激活了 dplyr。我又试了一次,它奏效了。感谢并为我的错误道歉。
【解决方案2】:
library(data.table)
df <- data.table(df)
df[, NewCol := seq(0,nrow(df),2), by=list(Item,Part)]

【讨论】:

  • 谢谢!这可行,但我收到一条警告消息:警告消息:1:In [.data.table(df, , :=(NewCol, seq(0, nrow(df), 2)), by = list(Item, :RHS 1 的长度为 7(大于组 1 的大小 (3))。最后 4 个元素将被丢弃。。我得到的相同:dat[, csum := c(0,cumsum(Time-Time+2)), by=c("Part","Item")]。无论如何,我希望计数基于时间,您的解决方案不保证如果时间没有排序,对吧?
【解决方案3】:

呃...df = cbind(df,NewColumn=c(0,2,4))?

【讨论】:

  • 这假设每个 Item,Part 减 3。
  • 是的,而且 OP 选择了一个遵守这一点的例子,也许不是偶然的......?
  • 如果数据没有像 OP 示例中那样排序,那么您的代码将不起作用。不要以为是这样。
【解决方案4】:

+1 用于库(plyr)

    library(plyr)
    ddply(df, c("Item","Part"), mutate,NewColumn = seq(0,4,2))



    Item Part   Time NewColumn
     1    1     1234    0
     1    1     1235    2
     1    1     1236    4
     1    2     345     0
     1    2     346     2
     1    2     347     4
     2    1     1546    0
     2    1     1547    2
     2    1     1548    4
     2    2     234     0
     2    2     235     2
     2    2     236     4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多