【问题标题】:R - How to selectively copy long format case responses to future years?R - 如何选择性地将长格式案例响应复制到未来几年?
【发布时间】:2019-02-01 01:08:04
【问题描述】:

我正在对长格式数据进行纵向分析。我在 2005 年、2009 年和 2013 年测量了我的个性(O、C、E、A、N),并每年测量我的因变量(工作满意度)。每个人都有自己的身份证。我有两个目标(我认为可能可以通过相同的基本逻辑来实现):

1) 我需要另一个变量(列)来指示每个人的性格测量的第一年。如果从未测量过个性,则返回 NA。例如,如果个性是在 2009 年首次测量的,则需要在该列中为该 ID 的每一行返回“2009”。

2)我需要另一个变量(列)来复制每个 ID 每年的个性项目响应,除非它被后来的测量年份(即 2009 年、2013 年)替换。例如,如果一个 ID 在 2005 年和 2009 年完成了性格测试,那么我需要将他们 2005 年的回答复制到 2006 年、2007 年和 2008 年,而不是 2009 年,因为以后的条目(如果存在)应该成为被复制的内容展望未来。

我曾尝试为这些创建一个函数,但最终失败了。

我希望这是有道理的。以下100个案例摘录:

structure(list(Person_ID = c(100003L, 100003L, 100003L, 100003L, 
100003L, 100003L, 100003L, 100003L, 100003L, 100003L, 100005L, 
100005L, 100005L, 100005L, 100005L, 100005L, 100005L, 100005L, 
100005L, 100006L, 100006L, 100006L, 100006L, 100006L, 100006L, 
100006L, 100006L, 100007L, 100007L, 100007L, 100007L, 100007L, 
100008L, 100008L, 100008L, 100009L, 100009L, 100010L, 100010L, 
100010L, 100010L, 100010L, 100010L, 100010L, 100010L, 100010L, 
100010L, 100011L, 100011L, 100011L, 100011L, 100011L, 100014L, 
100014L, 100014L, 100014L, 100014L, 100014L, 100014L, 100014L, 
100014L, 100014L, 100015L, 100015L, 100015L, 100015L, 100015L, 
100015L, 100015L, 100015L, 100015L, 100015L, 100016L, 100016L, 
100016L, 100016L, 100016L, 100016L, 100016L, 100016L, 100016L, 
100016L, 100018L, 100018L, 100018L, 100018L, 100018L, 100018L, 
100018L, 100018L, 100018L, 100018L, 100019L, 100019L, 100019L, 
100019L, 100019L, 100019L, 100019L, 100019L), Job_Satisfaction = c(0L, 
NA, 7L, NA, 8L, 10L, NA, NA, NA, NA, 9L, NA, NA, NA, NA, NA, 
NA, NA, NA, 6L, 10L, 8L, 9L, 7L, NA, 9L, 3L, NA, 10L, NA, NA, 
NA, NA, NA, NA, NA, NA, 5L, NA, NA, NA, NA, 5L, 4L, 8L, 5L, 5L, 
NA, NA, NA, 8L, NA, 8L, 6L, 8L, 7L, 7L, NA, NA, NA, NA, NA, 10L, 
9L, 9L, 9L, 10L, 8L, 10L, 9L, 8L, 9L, 7L, 9L, 9L, 8L, 8L, 9L, 
9L, 9L, 8L, 9L, NA, 7L, 7L, 8L, 7L, 8L, 7L, 7L, 8L, 7L, 7L, 7L, 
7L, 7L, 7L, 7L, 7L, 8L), Year = c(2005L, 2006L, 2007L, 2008L, 
2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2005L, 2007L, 2008L, 
2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2005L, 2008L, 2009L, 
2010L, 2011L, 2012L, 2013L, 2014L, 2008L, 2009L, 2010L, 2011L, 
2012L, 2005L, 2006L, 2007L, 2006L, 2007L, 2005L, 2006L, 2007L, 
2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2005L, 2006L, 
2007L, 2008L, 2009L, 2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 
2011L, 2012L, 2013L, 2014L, 2005L, 2006L, 2007L, 2008L, 2009L, 
2010L, 2011L, 2012L, 2013L, 2014L, 2005L, 2006L, 2007L, 2008L, 
2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2005L, 2006L, 2007L, 
2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2005L, 2006L, 
2007L, 2008L, 2009L, 2010L, 2011L, 2012L), O = c(5, NA, NA, NA, 
5.5, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
4.83333333333333, NA, 4.16666666666667, NA, NA, NA, 3.5, NA, 
NA, NA, NA, NA, NA, 3.83333333333333, NA, NA, NA, NA, 5, NA, 
NA, NA, 5.16666666666667, NA, NA, NA, 5, NA, 6, NA, NA, NA, NA, 
5.5, NA, NA, NA, 5.16666666666667, NA, NA, NA, 5, NA, 4.5, NA, 
NA, NA, 4.33333333333333, NA, NA, NA, 4, NA, 3, NA, NA, NA, 3.16666666666667, 
NA, NA, NA, 3.16666666666667, NA, 5.5, NA, NA, NA, 5.66666666666667, 
NA, NA, NA, 5.33333333333333, NA, 5.5, NA, NA, NA, 5, NA, NA, 
NA), C = c(4.66666666666667, NA, NA, NA, 6.83333333333333, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 4.33333333333333, 
NA, 4.16666666666667, NA, NA, NA, 4.33333333333333, NA, NA, NA, 
NA, NA, NA, 5.83333333333333, NA, NA, NA, NA, 5.66666666666667, 
NA, NA, NA, 6.66666666666667, NA, NA, NA, 6.66666666666667, NA, 
6.33333333333333, NA, NA, NA, NA, 5.83333333333333, NA, NA, NA, 
6, NA, NA, NA, 6, NA, 6.66666666666667, NA, NA, NA, 6.5, NA, 
NA, NA, 6.5, NA, 5.5, NA, NA, NA, 5.83333333333333, NA, NA, NA, 
5.16666666666667, NA, 5.5, NA, NA, NA, 5.66666666666667, NA, 
NA, NA, 5.16666666666667, NA, 5.66666666666667, NA, NA, NA, 6, 
NA, NA, NA), E = c(4.33333333333333, NA, NA, NA, 5.16666666666667, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 4.66666666666667, 
NA, 4.33333333333333, NA, NA, NA, 3.83333333333333, NA, NA, NA, 
NA, NA, NA, 4.33333333333333, NA, NA, NA, NA, 5.5, NA, NA, NA, 
5.16666666666667, NA, NA, NA, 5.33333333333333, NA, 6.16666666666667, 
NA, NA, NA, NA, 5.83333333333333, NA, NA, NA, 4.83333333333333, 
NA, NA, NA, 4.5, NA, 4.33333333333333, NA, NA, NA, 4.66666666666667, 
NA, NA, NA, 3.83333333333333, NA, 3.5, NA, NA, NA, 3.5, NA, NA, 
NA, 5.16666666666667, NA, 2, NA, NA, NA, 3.16666666666667, NA, 
NA, NA, 2.66666666666667, NA, 2.33333333333333, NA, NA, NA, 2.5, 
NA, NA, NA), A = c(6.75, NA, NA, NA, 7, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, 5.75, NA, 4.75, NA, NA, NA, 5, 
NA, NA, NA, NA, NA, NA, 5.5, NA, NA, NA, NA, 5, NA, NA, NA, 4.75, 
NA, NA, NA, 5, NA, 5.25, NA, NA, NA, NA, 5.5, NA, NA, NA, 5, 
NA, NA, NA, 5.5, NA, 6.75, NA, NA, NA, 5.75, NA, NA, NA, 6.75, 
NA, 5, NA, NA, NA, 3.5, NA, NA, NA, 4.75, NA, 5.75, NA, NA, NA, 
5.75, NA, NA, NA, 5.5, NA, 5.75, NA, NA, NA, 5.75, NA, NA, NA
), N = c(3.16666666666667, NA, NA, NA, 3.33333333333333, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 3.66666666666667, 
NA, 4.5, NA, NA, NA, 4.16666666666667, NA, NA, NA, NA, NA, NA, 
2.66666666666667, NA, NA, NA, NA, 2.66666666666667, NA, NA, NA, 
2.33333333333333, NA, NA, NA, 3.16666666666667, NA, 1.83333333333333, 
NA, NA, NA, NA, 1.33333333333333, NA, NA, NA, 2.83333333333333, 
NA, NA, NA, 1.83333333333333, NA, 3.83333333333333, NA, NA, NA, 
3, NA, NA, NA, 3.33333333333333, NA, 1.66666666666667, NA, NA, 
NA, 2.5, NA, NA, NA, 2.5, NA, 3.83333333333333, NA, NA, NA, 3.33333333333333, 
NA, NA, NA, 4.16666666666667, NA, 3.83333333333333, NA, NA, NA, 
4.5, NA, NA, NA)), .Names = c("Person_ID", "Job_Satisfaction", 
"Year", "O", "C", "E", "A", "N"), row.names = c(NA, 100L), class = "data.frame")

【问题讨论】:

    标签: r


    【解决方案1】:
    library(dplyr)
    library(zoo)
    data %>% group_by(Person_ID) %>% 
             mutate(first_year=dplyr::first(Year[!is.na(O)])) %>%   #return first year where O is not missing 
             mutate(O_fill=na.locf(O, na.rm = FALSE)) %>%  #using zoo::na.locf to replace NA's with non-NA prior to it
             head(n=20)
    
    # A tibble: 20 x 10
      # Groups:   Person_ID [3]
      Person_ID Job_Satisfaction  Year     O     C     E     A     N first_year O_fill
      <int>            <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl>      <int>  <dbl>
      1    100003                0  2005  5     4.67  4.33  6.75  3.17       2005   5   
      2    100003               NA  2006 NA    NA    NA    NA    NA          2005   5   
      3    100003                7  2007 NA    NA    NA    NA    NA          2005   5   
      4    100003               NA  2008 NA    NA    NA    NA    NA          2005   5   
      5    100003                8  2009  5.5   6.83  5.17  7     3.33       2005   5.5 
      6    100003               10  2010 NA    NA    NA    NA    NA          2005   5.5 
      7    100003               NA  2011 NA    NA    NA    NA    NA          2005   5.5 
      8    100003               NA  2012 NA    NA    NA    NA    NA          2005   5.5 
      9    100003               NA  2013 NA    NA    NA    NA    NA          2005   5.5 
      10    100003               NA  2014 NA    NA    NA    NA    NA          2005   5.5 
      11    100005                9  2005 NA    NA    NA    NA    NA            NA  NA   
      12    100005               NA  2007 NA    NA    NA    NA    NA            NA  NA   
      13    100005               NA  2008 NA    NA    NA    NA    NA            NA  NA   
      14    100005               NA  2009 NA    NA    NA    NA    NA            NA  NA   
      15    100005               NA  2010 NA    NA    NA    NA    NA            NA  NA   
      16    100005               NA  2011 NA    NA    NA    NA    NA            NA  NA   
      17    100005               NA  2012 NA    NA    NA    NA    NA            NA  NA   
      18    100005               NA  2013 NA    NA    NA    NA    NA            NA  NA   
      19    100005               NA  2014 NA    NA    NA    NA    NA            NA  NA   
      20    100006                6  2005  4.83  4.33  4.67  5.75  3.67       2005   4.83
    

    【讨论】:

    • 谢谢。不幸的是,这似乎不会为新 ID 重置“first_year”或“O_fill”中的数据。
    • @aspark2020 正如您在上面看到的,它对我有用。可能在group_by 动词中dplyrplyr 之间存在名称冲突,请尝试在新的R 会话中加载dplyrzoo,或直接使用dplyr::group_by 调用group_by
    【解决方案2】:

    我最终使用了一系列循环来完成我需要的操作。以“O”的特质为例:

    df$PersonalityYear <- ifelse(df$Year=="2005",
                        "2005",
                        ifelse(df$Year=="2009",
                          "2009",
                          ifelse(df$Year=="2013",
                            "2013",
                            "No")))
    
    #Code to solve the second goal.
    df$MostRecentYear <- NA
    n <- nrow(df)
    for (i in 2:n) df$MostRecentYear[i] <- ifelse(df$PersonalityYear[i]=="2013",
                                              2013,
                                              ifelse(df$PersonalityYear[i]=="2009",
                                                2009,
                                                ifelse(df$PersonalityYear[i]=="2005",
                                                  2005,
                                                  ifelse(df$Person_ID[i]==df$Person_ID[i-1],
                                                    df$MostRecentYear[i-1],
                                                    NA))))
    
    df$MostRecentO <- df$O
    for (i in 2:n) df$MostRecentO[i] <- ifelse(is.na(df$MostRecentYear[i]),
                                            NA,
                                                ifelse(df$MostRecentYear[i]==df$PersonalityYear[i],
                                                  df$O[i],
                                                  df$MostRecentO[i-1]))
    
    #Code to solve the first goal.
    df$FirstYear <- NA
    for (i in 2:n) df$FirstYear[i] <- ifelse(df$Person_ID[i]==df$Person_ID[i-1],
                                            ifelse(is.na(df$MostRecentYear[i-1]),
                                              df$MostRecentYear[i],
                                              df$FirstYear[i-1]),
                                          df$MostRecentYear[i])
    
    df$FirstYearO <- df$O
    for (i in 2:n) df$FirstYearO[i] <- ifelse(is.na(df$FirstYear[i]),
                                            NA,
                                            ifelse(df$FirstYear[i]==df$PersonalityYear[i],
                                                  df$O[i],
                                                  df$FirstYearO[i-1]))
    

    【讨论】:

      猜你喜欢
      • 2021-01-19
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 2018-02-15
      • 2020-05-23
      • 2021-12-11
      相关资源
      最近更新 更多