R语言 根据其他列中相同值在行中的出现情况更改列中的赋值

cgvd09ve  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(111)

我有这个数据集:

structure(list(ID = c(1, 2, 3, 4, 6, 7), V = c(0, 0, 1, 1, 
1, 0), Mus = c(1, 0, 1, 1, 1, 0), R = c(1, 0, 1, 1, 1, 1), 
    E = c(1, 0, 0, 1, 0, 0), S = c(1, 0, 1, 1, 1, 0), t = c(0, 
    0, 0, 1, 0, 0), score = c(1, 0.4, 1, 0.4, 0.4, 0.4)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"), na.action = structure(c(`5` = 5L, 
`12` = 12L, `15` = 15L, `21` = 21L, `22` = 22L, `23` = 23L, `34` = 34L, 
`44` = 44L, `46` = 46L, `52` = 52L, `56` = 56L, `57` = 57L, `58` = 58L
), class = "omit"))

我想对分数列进行新赋值,如下所示:
1.在每个ID的情况下,如果出现数字1大于3,则在最后一列中应该出现数字1。
1.在每个ID的情况下,如果出现数字1等于3,则最后一列应该出现数字0.4。
1.在每个ID的情况下,如果出现数字1小于3,则最后一列应该出现数字0。
请建议一种通过for循环、dplyr、map或apply函数来实现这一点的方法?
谢谢

xzabzqsa

xzabzqsa1#

这应该可以实现-计算新ones列中1的个数,然后使用case_when应用条件:

library(tidyverse)

df |> 
  rowwise() |> 
  mutate(ones = sum(c_across(V:t)),
         score = case_when(
           ones  > 3 ~ 1,
           ones == 3 ~ 0.4,
           ones < 3 ~ 0
         ))
#> # A tibble: 6 × 9
#> # Rowwise: 
#>      ID     V   Mus     R     E     S     t score  ones
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1     1     0     1     1     1     1     0     1     4
#> 2     2     0     0     0     0     0     0     0     0
#> 3     3     1     1     1     0     1     0     1     4
#> 4     4     1     1     1     1     1     1     1     6
#> 5     6     1     1     1     0     1     0     1     4
#> 6     7     0     0     1     0     0     0     0     1

为了让它更整洁,你可以直接在case_when中使用sum(c_across(V:t)),而不需要一个新的变量(尽管每次都要重复计算):

df |> 
  rowwise() |> 
  mutate(score = case_when(
           sum(c_across(V:t))  > 3 ~ 1,
           sum(c_across(V:t)) == 3 ~ 0.4,
           sum(c_across(V:t)) < 3 ~ 0
         ))

相关问题