【问题标题】:Easy and quick loop to extract values from another row in R, based on condition?根据条件从 R 中的另一行中轻松快速地循环提取值?
【发布时间】:2023-01-11 02:51:31
【问题描述】:

我正在使用个人标识符不可用的面板数据集。相反,我拥有的是跨波固定家庭的标识符(变量探索),每个家庭中个人的标识符随着波浪的变化而变化(变量北方) 和引用变量值的个人标识符北方在上一波中(变量北德普).因此,简化的数据框如下所示:

row Year nquest nord nordp
1 2010 1 1 NA
2 2012 1 1 1
3 2012 1 2 NA
4 2012 1 3 NA
5 2014 1 1 1
6 2014 1 2 3
7 2010 2 1 NA
8 2010 2 2 NA
9 2012 2 1 1
10 2012 2 2 2
11 2012 2 3 NA

在此示例中,第 1、2 和 5 行指的是同一个人;以及 4 和 6、7 和 9,以及 8 和 10(同样,北德普指的是北方在上一波中,而探索是固定的)。

有没有一种快速的方法可以提出一个变量来识别不同波浪中的同一个人?我已经尝试使用 for 循环创建复杂的标签并跨波提取字符,但它需要很长时间(数据集很大,但仍然很大)而且我相信有一种更简单的方法,dplyr或者其他的东西。与我在网站上找到的其他解决方案不同的是,我需要为每一次观察都这样做——所以没有指定值北方或者北德普或者探索.

谢谢!

编辑:理想情况下,我会想出一个这样的表:

row Year nquest nord nordp id
1 2010 1 1 NA 1
2 2012 1 1 1 1
3 2012 1 2 NA 2
4 2012 1 3 NA 3
5 2014 1 1 1 1
6 2014 1 2 3 3
7 2010 2 1 NA 4
8 2010 2 2 NA 5
9 2012 2 1 1 4
10 2012 2 2 2 5
11 2012 2 3 NA 6

【问题讨论】:

  • 嗨@akrun,理想情况下我会有一个额外的列,其值为1, 1, 2, 3, 1, 3。它可以采用不同的形式(我在想一个字符串组合探索与第一个北方available):重要的是它让我区分不同的人。谢谢!

标签: r dataframe dataset panel panel-data


【解决方案1】:

您可以尝试以下dplyr方法,它使用mutate创建一个新的id列,并使用case_when来实现逻辑。

作为最佳实践(来自在数据中使用大量标识符的人),与其让 ID 顺序排列,不如将家庭 ID (nquest) 与个人家庭成员 ID 连接起来可能更好。这将允许同时识别家庭和个人。为方便起见,最好将 ID 设为字母数字 - 因此下面输出一个 ID“Kx-x”,其中第一个整数是家庭 ID,第二个是个人 ID。字母 K 是任意的。

library(dplyr)

new_df <- df %>%
  group_by(nquest) %>%
  mutate(id = case_when(
    nord == 1 | nordp == 1 ~ 1,
    is.na(nordp) ~ as.numeric(nord),
    TRUE ~ as.numeric(nordp)
  ),
  id = paste0("K",nquest,"-" id))

输出:

#      row  Year nquest  nord nordp id   
#    <int> <int>  <int> <int> <int> <chr>
#  1     1  2010      1     1    NA K1-1 
#  2     2  2012      1     1     1 K1-1 
#  3     3  2012      1     2    NA K1-2 
#  4     4  2012      1     3    NA K1-3 
#  5     5  2014      1     1     1 K1-1 
#  6     6  2014      1     2     3 K1-3 
#  7     7  2010      2     1    NA K2-1 
#  8     8  2010      2     2    NA K2-2 
#  9     9  2012      2     1     1 K2-1 
# 10    10  2012      2     2     2 K2-2 
# 11    11  2012      2     3    NA K2-3 

数据:

df <- read.table(text = "row    Year    nquest  nord    nordp
1   2010    1   1   NA
2   2012    1   1   1
3   2012    1   2   NA
4   2012    1   3   NA
5   2014    1   1   1
6   2014    1   2   3
7   2010    2   1   NA
8   2010    2   2   NA
9   2012    2   1   1
10  2012    2   2   2
11  2012    2   3   NA", header = TRUE)

【讨论】:

  • 非常感谢@jpsmith。抱歉没有早点说清楚,但在我的例子中我有几个探索(即家庭)。所以这个关联应该是有条件的北方北德普属于同一探索.关于如何实现此条件的任何想法?再次感谢。
  • 谢谢@jpsmith,我刚刚看到了更新。我将很快尝试这个解决方案,如果它有效,我会通知你 - 非常感谢!
  • @a_jazz_man 查看我刚刚所做的编辑 - 我对您的问题有些冒昧,但希望它会有所帮助。让我知道这是否适合您,否则我可以重新编辑
  • 我完全同意标识符名称。我试过更新后的代码,也许我弄错了,但似乎还有一个问题:在你的例子中,它是否可行,因为北方对于那些必须跨越两个以上的浪潮联系起来的人来说,不会改变吗?当我应用它时,ID变量正确报告前一个北方, 但它无法与之前的相匹配北方与相应的北德普(再次指的是上一波中的同一个人)。
【解决方案2】:

这是一个选项

library(purrr)
library(dplyr)
library(stringr)
df1 %>% 
  mutate(id = as.integer(factor(pmap_chr(across(nquest:nordp),
   ~  {v1 <- unique(na.omit(c(...)));str_c(first(v1), last(v1))}))))

-输出

   row Year nquest nord nordp id
1    1 2010      1    1    NA  1
2    2 2012      1    1     1  1
3    3 2012      1    2    NA  2
4    4 2012      1    3    NA  3
5    5 2014      1    1     1  1
6    6 2014      1    2     3  3
7    7 2010      2    1    NA  4
8    8 2010      2    2    NA  5
9    9 2012      2    1     1  4
10  10 2012      2    2     2  5
11  11 2012      2    3    NA  6

数据

df1 <- structure(list(row = 1:11, Year = c(2010L, 2012L, 2012L, 2012L, 
2014L, 2014L, 2010L, 2010L, 2012L, 2012L, 2012L), nquest = c(1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), nord = c(1L, 1L, 2L, 
3L, 1L, 2L, 1L, 2L, 1L, 2L, 3L), nordp = c(NA, 1L, NA, NA, 1L, 
3L, NA, NA, 1L, 2L, NA)), class = "data.frame", row.names = c(NA, 
-11L))

【讨论】:

    猜你喜欢
    • 2021-06-18
    • 2022-06-24
    • 1970-01-01
    • 2020-07-07
    • 2012-07-23
    • 2021-11-16
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    相关资源
    最近更新 更多