我是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
答案 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,这也可以