R语言 在数据框中分配特定值

mrzz3bfm  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(134)

我想过滤我的数据。下面你可以看到我的数据看起来如何。

df<-data.frame(  
          Description=c("15","11","12","NA","Total","NA","9","18","NA","Total"),
          Value=c(158,196,NA,156,140,693,854,NA,904,925))

df

现在我想过滤并分配一些文本到一个额外的列中。所需的输出需要如下表所示。也就是说,我想引入标题为Sales的额外列。在这个列中,使用if-else语句,我想引入两个分类值。第一个是Sold,第二个是Unsold。第一行到第'Total'需要具有值'Sold'并且在此之下的其它值需要具有Unsold

我试着用这个命令来做这件事,但不幸的是不是我所期望的工作。

df1$Sales <- ifelse(df$Description==c('Total'),'Sold','Unsold')

有人能帮我解决这个问题吗?

qcbq4gxm

qcbq4gxm1#

df$Sales <- ifelse(cumsum(dplyr::lag(df$Description, default = "") == "Total") > 0, 
                   "Unsold", 
                   "Sold")
df
#>    Description Value  Sales
#> 1           15   158   Sold
#> 2           11   196   Sold
#> 3           12    NA   Sold
#> 4           NA   156   Sold
#> 5        Total   140   Sold
#> 6           NA   693 Unsold
#> 7            9   854 Unsold
#> 8           18    NA Unsold
#> 9           NA   904 Unsold
#> 10       Total   925 Unsold

要分解逻辑:

  1. dplyr::lag检查上一个条目是否为"Total"。设置除"Total"以外的任何字符串的默认值可防止将NA创建为第一个条目,因为这会将不需要的NA带入下一步。
  2. cumsum返回"Total"被视为前一项的次数。
    1.检查cumsum的结果是否大于0会将步骤2转换为二进制结果:"Total"要么已找到,要么未找到。
    1.如果"Total"已经被找到,它就没有被售出;否则就卖了。
    你也可以重新安排:
dplyr::lag(cumsum(df$Description == "Total") < 1, default = TRUE)

得到相同的结果,且真假结果的顺序相同。

pw9qyyiw

pw9qyyiw2#

如果您知道soldunsold一样多,则可以使用第一个解决方案。
如果你想允许每一个的奇数和未知数,你可以使用第二个解决方案。

library(tidyverse)

# FIRST SOLUTION
df |>
  mutate(Sales = ifelse(row_number() <= nrow(df) / 2, "Sold", "Unsold"))

# SECOND SOLUTION
df |>
  mutate(o = Description == "Total") |>
  mutate(Sales = ifelse(row_number() > match(TRUE, o), "Unsold", "Sold")) |>
  select(-o)
#>    Description Value  Sales
#> 1           15   158   Sold
#> 2           11   196   Sold
#> 3           12    NA   Sold
#> 4           NA   156   Sold
#> 5        Total   140   Sold
#> 6           NA   693 Unsold
#> 7            9   854 Unsold
#> 8           18    NA Unsold
#> 9           NA   904 Unsold
#> 10       Total   925 Unsold

相关问题