R语言 尝试根据条件系统地更改每隔一行的值

blmhpbnm  于 2023-04-18  发布在  其他
关注(0)|答案(2)|浏览(115)

我有一个数据框,其结构如下所示。基于特定条件,我想为该条件为真的每隔一行分配一个新值。我想知道是否有人可以帮助我为发生条件的每隔一行分配新值,并将这些更改保留在我的主数据框中。
在我的数据中,每个人都从每种类型的评分员那里得到了分数。有评分员1,评分员2和其他。我的数据集中的每个人都应该从这三个评分员中得到一个评分。然而,有些人从两个“其他”评分员那里得到了分数。所以在人们从两个“其他”评分员那里得到分数的情况下,我想把第二个“Other”评分者标记为“Other 2”。我试图用下面列出的代码来做到这一点,但我很快意识到,通过使用“filter”命令,我将无法取消过滤,并保留我在更广泛的数据集中所做的更改。
以下是我的当前代码:

d %>% filter(rater=="Other") %>% group_by(id) %>% 
  filter(n()>1) %>% mutate(rater= case_when(ifelse(row_number()%%2==0,"Other2",rater))

下面我展示了我的数据当前的样子以及我希望数据的样子。
以下是我的数据目前的样子:
| 身份证|评分员|评分员评分|
| --------------|--------------|--------------|
| 1个|评分员2|三|
| 1个|评分员1|二|
| 1个|其他|三|
| 二|评分员1|一点五|
| 二|评分员2|3.2|
| 二|其他|1.1|
| 二|其他|二|
| 三|评分员1|二点五|
| 三|评分员2|2.7|
| 三|其他|2.1|
| 三|其他|二|
| 四|评分员1|二点五|
| 四|评分员2|2.7|
| 四|其他|2.1|
| 四|其他|二|
| 五|评分员1|二点五|
| 五|评分员2|2.7|
| 五|其他|2.1|
下面是我希望我的数据看起来像什么(你会注意到,第二个“其他”评分者已更改为“其他2”:
| 身份证|评分员|评分员评分|
| --------------|--------------|--------------|
| 1个|评分员2|三|
| 1个|评分员1|二|
| 1个|其他|三|
| 二|评分员1|一点五|
| 二|评分员2|3.2|
| 二|其他|1.1|
| 二|其他2|二|
| 三|评分员1|二点五|
| 三|评分员2|2.7|
| 三|其他|2.1|
| 三|其他2|二|
| 四|评分员1|二点五|
| 四|评分员2|2.7|
| 四|其他|2.1|
| 四|其他2|二|
| 五|评分员1|二点五|
| 五|评分员2|2.7|
| 五|其他|2.1|
有人能帮我吗?谢谢!

i7uq4tfw

i7uq4tfw1#

d %>%
  group_by(id) %>%
  mutate(Other_count = cumsum(rater == "Other"),
         rater = if_else(rater == "Other" & Other_count > 1,
                         "Other2",  # EDIT
                         rater)) %>%
  ungroup() %>%
  select(-Other_count)

结果如下。根据您的描述,我怀疑您最后两行所需的输出中有错别字。第10行似乎是ID 2的第三个其他,第11行是ID 3的第一个其他。

# A tibble: 11 × 3
      id rater  raterscore
   <int> <chr>       <dbl>
 1     1 rater2        3  
 2     1 rater1        2  
 3     1 Other         3  
 4     2 rater1        1.5
 5     2 rater2        3.2
 6     2 Other         1.1
 7     2 Other2        2  
 8     3 rater1        2.5
 9     2 rater2        2.7
10     2 Other2        2.1
11     3 Other         2
9ceoxa92

9ceoxa922#

我怀疑排印错误是在id列第9行和第10行应该是3:
我们可以这样做:

library(dplyr)

df %>% 
  group_by(id) %>% 
  mutate( x = cumsum(rater == "Other"),
          x = ifelse(x == 2, 2, "")) %>% 
  mutate(rater = paste0(rater, x), .keep="unused")

使用dplyr >= 1.1.0更优雅

df %>% 
  mutate( x = cumsum(rater == "Other"),
          x = ifelse(x == 2, 2, ""), .by=id) %>% 
  mutate(rater = paste0(rater, x), .keep="unused")
id rater  raterscore
   <int> <chr>       <dbl>
 1     1 rater2        3  
 2     1 rater1        2  
 3     1 Other         3  
 4     2 rater1        1.5
 5     2 rater2        3.2
 6     2 Other         1.1
 7     2 Other2        2  
 8     3 rater1        2.5
 9     3 rater2        2.7
10     3 Other         2.1
11     3 Other2        2

相关问题