根据groupby Item将值移至下一行

时间:2019-08-23 09:02:05

标签: r

我是R的新手。有人可以帮我吗

对于df以下,我只需要检查每个项目的第一行,并在“新价格”列中将其价格设为0,然后将其价格添加到同一项目的下一行。

Df

df
    ID1  ID2    x     y
0    0   35    1.3   2.3
1    0   35    1.3   2.3
2    1   33    3.3   2.3
3    2   27    3.6   4.5

在这里,对于商品A,我们将检查第一行,在Newprice列中,将其值设为0,然后将10移至下一行,对于同一商品将其变为15。类似地,对于商品B

我想要下面的输出

输出

df <- structure(list(Item = c("A", "A", "B", "B"), city = c("Delhi", 
"Mumbai", "Delhi", "Mumbai"), price = c(10L, 5L, 10L, 5L), value = c(0L, 
2L, 1L, 2L)), class = "data.frame", row.names = c(NA, -4L))


Item    city   price  value
 A      Delhi   10      0
 A      Mumbai   5      2
 B      Delhi   10      1
 B      Mumbai   5      2  

2 个答案:

答案 0 :(得分:2)

如果每个组只有两行,我们可以group_by Item并在新列中添加sum中的0和Price。使用dplyr将会

library(dplyr)

df %>%
  group_by(Item) %>%
  mutate(Newprice = c(0, sum(price, na.rm = TRUE)))

#  Item  city   price value Newprice
# <chr> <chr>  <int> <int>    <dbl>
#1 A     Delhi     10     0        0
#2 A     Mumbai     5     2       15
#3 B     Delhi     10     1        0
#4 B     Mumbai     5     2       15

等效的基数R和data.table将会是

df$NewPrice <- with(df, ave(price, Item,FUN =function(x)c(0, sum(x, na.rm = TRUE))))

library(data.table)
setDT(df)[, NewPrice := c(0, sum(price, na.rm = TRUE)), by = Item]

答案 1 :(得分:0)

这是一种可以处理边缘情况的选项

library(dplyr)
df %>%
    group_by(Item) %>% 
    mutate(Newprice = (row_number() == n())*sum(price))
# A tibble: 4 x 5
# Groups:   Item [2]
#  Item  city   price value Newprice
#  <chr> <chr>  <int> <int>    <int>
#1 A     Delhi     10     0        0
#2 A     Mumbai     5     2       15
#3 B     Delhi     10     1        0
#4 B     Mumbai     5     2       15

即如果组中的元素数不等于2,这也可以