【问题标题】:How to create a new column which displays "1" for each new group of data?如何为每组新数据创建一个显示“1”的新列?
【发布时间】:2020-11-16 23:27:52
【问题描述】:

我正在处理一个非常大的数据集,因此为了简单起见,我将使用示例数据集。这是示例数据集:

df <- data.frame(Class = rep(c("Class A", "Class B"), each = 6),
                 Student = rep(c("Tom", "Ana", "Sam", "Ivy"), each = 3),
                 Subject = rep(c("Maths", "English", "Science"), times = 4),
                 Score = c(80, 75, 72, 86, 78, 80, 75, 77, 84, 81, 79, 88)
                 )

     Class Student Subject Score
1  Class A     Tom   Maths    80
2  Class A     Tom English    75
3  Class A     Tom Science    72
4  Class A     Ana   Maths    86
5  Class A     Ana English    78
6  Class A     Ana Science    80
7  Class B     Sam   Maths    75
8  Class B     Sam English    77
9  Class B     Sam Science    84
10 Class B     Ivy   Maths    81
11 Class B     Ivy English    79
12 Class B     Ivy Science    88

如何使用mutate() 添加一个名为new_block 的新列,该列在出现不同学生数据的每一行显示1,否则0?本质上,我希望此列的第 1、4、7、10 行有 1

如果可能,添加另一个名为 last_record 的列也很好,它为每个学生的最后一行记录显示 1,如果不是,则为 0 - 所以 1 用于第 3、6 行, 9, 12.

另外,是否可以使用ifelse() 创建这些列?

非常感谢任何帮助/建议 :)

【问题讨论】:

  • 这不能回答你的问题,但你能不能只按Student 分组并得到第一行和最后一行?不过,这取决于您使用它的目的。
  • 如果您还不知道这一点,以下解决方案中使用的case_when 允许您向量化多个ifelse 语句。这就是为什么您没有看到明确使用 ifelse() 的原因。

标签: r dataframe tidyverse dplyr


【解决方案1】:

使用dplyr

library(dplyr)

df %>% 
  group_by(Student) %>% 
  mutate(new_block = +(row_number() == 1),
         last_record = +(row_number() == n())) %>%
  ungroup()

给予

# A tibble: 12 x 6
   Class   Student Subject Score new_block last_record
   <fct>   <fct>   <fct>   <dbl>     <int>       <int>
 1 Class A Tom     Maths      80         1           0
 2 Class A Tom     English    75         0           0
 3 Class A Tom     Science    72         0           1
 4 Class A Ana     Maths      86         1           0
 5 Class A Ana     English    78         0           0
 6 Class A Ana     Science    80         0           1
 7 Class B Sam     Maths      75         1           0
 8 Class B Sam     English    77         0           0
 9 Class B Sam     Science    84         0           1
10 Class B Ivy     Maths      81         1           0
11 Class B Ivy     English    79         0           0
12 Class B Ivy     Science    88         0           1

【讨论】:

    【解决方案2】:

    这行得通吗:

    library(dplyr)
    df %>% group_by(Student) %>% mutate(new_block = case_when(row_number() == 1 ~ 1, TRUE ~ 0), last_record = case_when(row_number() == n() ~ 1, TRUE ~ 0))
    # A tibble: 12 x 6
    # Groups:   Student [4]
       Class   Student Subject Score new_block last_record
       <chr>   <chr>   <chr>   <dbl>     <dbl>       <dbl>
     1 Class A Tom     Maths      80         1           0
     2 Class A Tom     English    75         0           0
     3 Class A Tom     Science    72         0           1
     4 Class A Ana     Maths      86         1           0
     5 Class A Ana     English    78         0           0
     6 Class A Ana     Science    80         0           1
     7 Class B Sam     Maths      75         1           0
     8 Class B Sam     English    77         0           0
     9 Class B Sam     Science    84         0           1
    10 Class B Ivy     Maths      81         1           0
    11 Class B Ivy     English    79         0           0
    12 Class B Ivy     Science    88         0           1
    > 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多