【问题标题】:Homogenize grouped values in R in panel dataset在面板数据集中均匀化 R 中的分组值
【发布时间】:2020-04-14 12:42:18
【问题描述】:

我有一个家庭面板调查数据集。它有两项调查:一项针对个人,一项针对家庭。每个家庭中的一个人都回答了这两个问题,而家庭中的所有其他人只回答了个人调查。市政位置仅在填充家庭的人中。数据集是一个面板,因此对于不同的研究波次,每个观察都存在多次。所以基本上我有这样的东西:

  df <- data.frame(id = c (11,11, 12,12,13, 13,14, 14,21, 21,22, 22,31, 31,32, 32,33, 33,34, 34,41, 41,42, 42,43, 43,44, 44,51, 51,61, 61,62, 62))
df$idhousehold <- c(1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4, 5,5, 6, 6, 6,6)
df$municipality <- c(NA, NA, NA,NA, NA, NA,"A","A",NA, NA, "A", "A",NA, NA,NA, NA, "B", "B", NA,NA, "A", "A",NA,NA,NA,NA,NA,NA, "C", "C","B","B",NA, NA)
df$year <- c(1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2)
df

我基本上想做的是为同一家庭中的每个人分配相同的市政价值。在上面的示例中,这意味着家庭 1、2 和 4 中的每个人的市镇值都为“A”,而家庭 3 和 6 中的每个人在 5 中的值都为 B 和 C。我无法手动执行此操作,因为数据集有大约 13 万个观测值。

我尝试了多种方法来组合数据和改变新变量,但我无法得到我想要的。

感谢您的帮助!

【问题讨论】:

    标签: r group-by dplyr panel-data


    【解决方案1】:

    由于每个家庭只有一个值,您可以这样做:

    df$municipality <- ave(df$municipality, df$idhousehold, FUN = na.omit)
    

    但是,由于数据中似乎存在缺失值,并且在每个家庭有多个市政当局值的情况下,您可以这样做:

    df$municipality <- ave(df$municipality, df$idhousehold, FUN = function(x) unique(na.omit(x))[1])
    
    df
       id idhousehold municipality
    1  11           1            A
    2  12           1            A
    3  13           1            A
    4  14           1            A
    5  21           2            A
    6  22           2            A
    7  31           3            B
    8  32           3            B
    9  33           3            B
    10 34           3            B
    11 41           4            A
    12 42           4            A
    13 43           4            A
    14 44           4            A
    15 51           5            C
    16 61           6            B
    17 62           6            B
    

    等同于dplyr:

    df %>%
      group_by(idhousehold) %>%
      mutate(municipality = unique(na.omit(municipality))[1])
    

    【讨论】:

    • 谢谢!但它不会这样做:第一个解决方案产生“错误:列municipality必须是长度5(组大小)或一个,而不是2”,第二个解决方案:“x [i]
    • 您有两种情况,即 id 有多个市镇值,也有两种情况都没有。
    • 已编辑我的答案,但最好查看您的真实数据样本。由于每个家庭有多个自治市值,您应该检查它们是否不是多个不同的值。还要检查NA 值是否实际上是NA,而不是伪装成NA 的字符或因子值。
    • 抱歉,这是一个面板数据集,因此每个观测值都存在多个波/年。我现在更新了问题
    【解决方案2】:

    使用tidyr 中的fill() 函数的方法:

    library(tidyverse)
    
    df <- data.frame(id = c (11,11, 12,12,13, 13,14, 14,21, 21,22, 22,31, 31,32, 32,33, 33,34, 34,41, 41,42, 42,43, 43,44, 44,51, 51,61, 61,62, 62))
    df$idhousehold <- c(1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4, 5,5, 6, 6, 6,6)
    df$municipality <- c(NA, NA, NA,NA, NA, NA,"A","A",NA, NA, "A", "A",NA, NA,NA, NA, "B", "B", NA,NA, "A", "A",NA,NA,NA,NA,NA,NA, "C", "C","B","B",NA, NA)
    df$year <- c(1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2)
    
    df <- df %>% 
      group_by(idhousehold) %>% 
      fill(municipality, .direction = "updown") %>% 
      ungroup()
    
    df
    #> # A tibble: 34 x 4
    #>       id idhousehold municipality  year
    #>    <dbl>       <dbl> <chr>        <dbl>
    #>  1    11           1 A                1
    #>  2    11           1 A                2
    #>  3    12           1 A                1
    #>  4    12           1 A                2
    #>  5    13           1 A                1
    #>  6    13           1 A                2
    #>  7    14           1 A                1
    #>  8    14           1 A                2
    #>  9    21           2 A                1
    #> 10    21           2 A                2
    #> # … with 24 more rows
    

    reprex package (v0.3.0) 于 2020-04-14 创建

    【讨论】:

      【解决方案3】:
      df <- df %>% mutate(municipality=case_when(idhousehold %in% c(1,2,4)~ "A",idhousehold %in% c(3,6) ~ "B",idhousehold %in% 5 ~"C"))
      

      【讨论】:

      • 谢谢!是的,这样做可以,但我有超过 130k 的观察结果和数百个家庭值,所以我要花很长时间才能做到这一点,而且我可能会犯一些错误。
      猜你喜欢
      • 2016-07-12
      • 1970-01-01
      • 2020-01-15
      • 2021-04-30
      • 1970-01-01
      • 2011-07-16
      • 2021-05-16
      • 2020-01-17
      • 2011-06-24
      相关资源
      最近更新 更多