r - 根据 R 中的其他变量更改值

标签 r dataframe dplyr tidyverse

我有一个相当大的包含销售信息的数据集。其中一些具有负面salesvalue (信用票据)。我需要将这些贷方票据连接到原始销售票据,同时保留原始销售日期。没有单个变量指示贷方票据属于哪个销售票据,因此我必须确定所有其他变量都相等的位置。

示例数据:

data <- data.frame(number = 1:4,               
                   Date=c("02-01-2022", "06-01-2022", "07-01-2022", "06-01-2022"),
                   state = c("filet", "filet", "whole", "filet"),
                   specie = c("haddock", "cod", "haddock", "cod"),
                   salesvalue= c(300,500,200,-400),
                   salesdate=c("01-01-2022", "05-01-2022", "06-01-2022", "12-01-2022"))
data  

#  number       Date state  specie value  salesdate
#      1 02-01-2022 filet haddock   300 01-01-2022
#      2 06-01-2022 filet     cod   500 05-01-2022
#      3 07-01-2022 whole haddock   200 06-01-2022
#      4 06-01-2022 filet     cod  -400 12-01-2022

我要改salesdatesalesvalue < 0salesdate哪里salesvalue > 0和其他条件相同,然后汇总它们。

在这种情况下我想更改 salesdate从“12-01-2022”到“05-01-2022”的数字 4(与 2 相同,所有其他值都相等)。

这是我尝试过的:

datanew <- data %>% 
  group_by(Date, state, specie, value) %>% 
  mutate(date_sale=if_else(value < 0, 
         first(salesdate[value>0]), salesdate)) %>% 
  group_by(Date, state, specie, value, salesdate, date_sale) %>% 
  summarise(value_new=sum(value))

 
datanew 

# Date       state specie  value salesdate  date_sale  value_new
  <chr>      <chr> <chr>   <dbl> <chr>      <chr>          <dbl>
# 02-01-2022 filet haddock   300 01-01-2022 01-01-2022       300
# 06-01-2022 filet cod      -400 12-01-2022 NA              -400
# 06-01-2022 filet cod       500 05-01-2022 05-01-2022       500
# 07-01-2022 whole haddock   200 06-01-2022 06-01-2022       200

但这并不能解决我的问题。我不知道如何解决这个问题,并且希望得到任何建议!

提前谢谢您!

最佳答案

您可以使用rows_update():

library(dplyr)

data %>%
  filter(salesvalue >= 0) %>%
  select(-c(number, salesvalue)) %>%
  rows_update(data, ., by = c("Date", "state", "specie"))

#   number       Date state  specie salesvalue  salesdate
# 1      1 02-01-2022 filet haddock        300 01-01-2022
# 2      2 06-01-2022 filet     cod        500 05-01-2022
# 3      3 07-01-2022 whole haddock        200 06-01-2022
# 4      4 06-01-2022 filet     cod       -400 05-01-2022

另一种选择:

data %>%
  filter(salesvalue >= 0) %>%
  select(-c(number, salesvalue), x = salesdate) %>%
  left_join(data, .) %>%
  mutate(salesdate = ifelse(salesvalue < 0, x, salesdate)) %>%
  select(-x)

关于r - 根据 R 中的其他变量更改值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74975360/

相关文章:

python - 如何操作 pandas 数据框列,其中列名是带有后缀的日期时间字符串?

r - pmap 在不同长度的列表上

r - dplyr group_by 在汇总后保留额外的列

r - 根据其他列数据框 r 中的值添加列

python - 如何使用 boto3 将 S3 中的单个 Parquet 文件读入 Pandas 数据帧?

python - 根据列定义的范围合并数据框

r - 如何在这个由几个不同的几何图形组成的ggplot中手动指定图例文本/颜色?

r - 为什么是 "if an object has two bindings, and one goes away, the reference count does not go back to 1"?

r - ggvis R 中的标签百分比

r - 合并行,并用group_by和填充空白位置?