首页 > 解决方案 > 定义一个新变量来计算另一列的组元素

问题描述

我有 2 列,HHVEH 和一组 SAMPN。SAMPN 的所有成员都具有相同的 HHVEH。我想定义一个新列,在每组中为 2,直到 HHVEH 的数量。

例子

          SAMPN      PERNO HHVEH
            1          1     1
            1          2     1
            1          3     1
            2          1     2
            3          2     2
            3          3     2
            4          4     0
            4          3     0

输出

          SAMPN      PERNO HHVEH      mode.car
            1          1     1           2
            1          2     1           NA
            1          3     1           NA
            2          1     2           2
            3          2     2           2
            3          3     2           2
            4          4     0          NA
            4          3     0          NA

解释:第一组 HHVEH==1 所以第一行是 2 其他 NA。第二组 HHVEH==2 所以它的前 2 个 roes 应该是 2,但只有一行,所以该行是 2。第三组 HHVEH==2 都得到 2 最后一组 HHVEH==0 所以全部不适用。

structure(list(SAMPN = c("  827", "  827", " 1133", " 1133", 
" 1133", " 1133", " 1133", " 1133", " 1857", " 1857", " 1857"
), HHVEH = c(3, 3, 2, 2, 2, 2, 2, 2, 3, 3, 3), PERNO = structure(c(2L, 
4L, 4L, 3L, 3L, 5L, 1L, 1L, 3L, 2L, 3L), .Label = c("1", "2", 
"3", "4", "5", "6", "7"), class = "factor")), row.names = c(NA, 
-11L), groups = structure(list(SAMPN = c("  827", " 1133", " 1857"
), .rows = list(1:2, 3:8, 9:11)), row.names = c(NA, -3L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))


  SAMPN   HHVEH PERNO      mode.car
   <chr>   <dbl> <fct>
 1 "  827"     3 2            2
 2 "  827"     3 4            2
 3 " 1133"     2 4            2
 4 " 1133"     2 3            2 
 5 " 1133"     2 3            NA
 6 " 1133"     2 5            NA
 7 " 1133"     2 1            NA
 8 " 1133"     2 1            NA
 9 " 1857"     3 3            2
10 " 1857"     3 2            2
11 " 1857"     3 3            2

标签: rdataframe

解决方案


这是基于更新数据的一种选择。按“SAMPN”分组后,通过根据“HHVEH”rep中的值查找 2 来创建first“mode.car”,其余的使用 NA

library(dplyr)
df1 %>%
   group_by(SAMPN) %>% 
   mutate(mode.car = rep(c(2, NA_integer_), 
           c(pmin(n(), first(HHVEH)), pmax(0, n() - first(HHVEH)))))
# A tibble: 11 x 4
# Groups:   SAMPN [3]
#   SAMPN   HHVEH PERNO mode.car
#   <chr>   <dbl> <fct>    <dbl>
# 1 "  827"     3 2            2
# 2 "  827"     3 4            2
# 3 " 1133"     2 4            2
# 4 " 1133"     2 3            2
# 5 " 1133"     2 3           NA
# 6 " 1133"     2 5           NA
# 7 " 1133"     2 1           NA
# 8 " 1133"     2 1           NA
# 9 " 1857"     3 3            2
#10 " 1857"     3 2            2
#11 " 1857"     3 3            2

推荐阅读