根据R上数据表的条件创建列

问题描述 投票:0回答:2

我正在尝试为 R 上的数据表创建一个圆形列。它应该按标识符分组。

条件是这样的:

  • 当看到两个选项(A,B)时,每一轮就完成了
  • 完成一轮后,轮数加1。

你能帮我解决这个问题吗?

谢谢!

enter image description here

我的问题是,当我创建列时,我总是必须为回合结束的观察输入错误的回合数。例如:观察 3 是 round = 2 而不是 round = 1

r datatable tidyr
2个回答
0
投票

这是来自

这篇文章的最佳答案的
dplyr解决方案,稍作更改(数据归功于@Leroy Tyrone):

library(dplyr)

df <- data.frame(identifier = rep(c("122-1-1", 
                                    "123-4-5", 
                                    "234-5-6"),
                                  each = 4),
                 trial = rep(1:4, 3),
                 option = c("A", "A", "B", "A", 
                            "A", "B", "B", "A", 
                            "A", "A", "A", "A"),stringsAsFactors = F)


df%>%
  mutate(round=with(rle(option), rep(ave(lengths, values, FUN = seq_along), lengths)),.by=identifier)

   identifier trial option round
1     122-1-1     1      A     1
2     122-1-1     2      A     1
3     122-1-1     3      B     1
4     122-1-1     4      A     2
5     123-4-5     1      A     1
6     123-4-5     2      B     1
7     123-4-5     3      B     1
8     123-4-5     4      A     2
9     234-5-6     1      A     1
10    234-5-6     2      A     1
11    234-5-6     3      A     1
12    234-5-6     4      A     1

0
投票

这将实现您在示例中概述的内容。我将变量“round”更改为“round_”,因为

round()
是 R 函数:

library(dplyr)

# Sample data
df <- data.frame(identifier = rep(c("122-1-1", 
                                    "123-4-5", 
                                    "234-5-6"),
                                  each = 4),
                 trial = rep(1:4, 3),
                 option = c("A", "A", "B", "A", 
                            "A", "B", "B", "A", 
                            "A", "A", "A", "A"))

df %>%
  group_by(identifier) %>%
  mutate(round_ = ifelse("A" %in% option &
                           "B" %in% option &
                           trial == max(trial), 2, 1)) %>%
  ungroup()

# A tibble: 12 × 4
 identifier  trial option  round_
      <chr>  <int>  <chr>   <dbl>
1   122-1-1      1      A       1
2   122-1-1      2      A       1
3   122-1-1      3      B       1
4   122-1-1      4      A       2
5   123-4-5      1      A       1
6   123-4-5      2      B       1
7   123-4-5      3      B       1
8   123-4-5      4      A       2
9   234-5-6      1      A       1
10  234-5-6      2      A       1
11  234-5-6      3      A       1
12  234-5-6      4      A       1

© www.soinside.com 2019 - 2024. All rights reserved.