【问题标题】:Create and fill columns in a dataset with data in rows from a different dataset使用来自不同数据集的行中的数据创建和填充数据集中的列
【发布时间】:2021-04-23 07:28:40
【问题描述】:

我的 DATASET1 包含三个主要列:国家、ID(政党)和意识形态(0-10 范围内的政治立场测量)。每行代表特定国家/地区的不同政党。

我需要把这个数据传到DATASET2,其中每一行都是一个国家(其实我正在处理的真实数据每个国家都有几千行,代表民意调查中的受访者,不过我已经分组了到国家级数据,以便更容易处理和解决这个问题)。在这个数据集中,我有一些列组,其中包含与每个国家最重要的政党相关的数据 - PARTY A、PARTY B、PARTY C 等。其中一组列的 ID 与另一个数据集中的 ID 相同,所以我们可以使用它来匹配来自其他数据集的数据。

我想要的输出:每一方的“意识形态”列对应于 PARTY A、B 等,但也适用于数据集 2 中未考虑的其他方(例如“ideology_otherparty_1”、“ideology_otherparty_2”、等等)

我正在尝试使用诸如 gatherspread 之类的 TIDYR 函数以及“match”或“case_when to match PARTY_A 等其他函数”来找到一种方法. 与 DATASET1 中的相应行。问题是我不知道如何组合这些函数以使其工作。

这是我拥有的数据示例:

dataset1< - structure(list(country = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 
4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 
8L), .Label = c("Argentina", "Brazil", "France", "Japan", "Mexico", 
"Switzerland", "UK", "US"), class = "factor"), ID = 1:71, ideology = c(5L, 
9L, 4L, 8L, 9L, 0L, 0L, 4L, 7L, 3L, 0L, 1L, 2L, 9L, 1L, 7L, 7L, 
1L, 6L, 6L, 1L, 1L, 1L, 8L, 2L, 5L, 5L, 0L, 0L, 9L, 8L, 6L, 8L, 
7L, 7L, 8L, 6L, 4L, 4L, 8L, 6L, 3L, 6L, 5L, 3L, 7L, 9L, 4L, 0L, 
0L, 1L, 0L, 9L, 4L, 8L, 4L, 9L, 4L, 5L, 1L, 4L, 7L, 7L, 9L, 4L, 
4L, 1L, 7L, 3L, 6L, 6L)), class = "data.frame", row.names = c(NA, 
-71L)) 

dataset2 <- structure(list(country = structure(1:8, .Label = c("Argentina", 
"Brazil", "France", "Japan", "Mexico", "Switzerland", "UK", "US"
), class = "factor"), party_A.ID = c(1L, 10L, 25L, 37L, 43L, 
56L, 64L, 68L), party_B_ID = c(2L, 11L, 26L, 38L, 44L, 57L, 65L, 
69L), party_C_ID = c(3L, 12L, 27L, 39L, 47L, 58L, 66L, 70L), 
    party_D_ID = c(4L, 13L, 28L, 40L, 48L, 59L, 67L, 71L), party_E_ID = c(6L, 
    14L, 29L, NA, 49L, 60L, NA, NA)), class = "data.frame", row.names = c(NA, 
-8L))

这是我想要的输出:

output <- structure(list(country = structure(1:8, .Label = c("Argentina", 
"Brazil", "France", "Japan", "Mexico", "Switzerland", "UK", "US"
), class = "factor"), party_A.ID = c(1L, 10L, 25L, 37L, 43L, 
56L, 64L, 68L), party_B_ID = c(2L, 11L, 26L, 38L, 44L, 57L, 65L, 
69L), party_C_ID = c(3L, 12L, 27L, 39L, 47L, 58L, 66L, 70L), 
    party_D_ID = c(4L, 13L, 28L, 40L, 48L, 59L, 67L, 71L), party_E_ID = c(6L, 
    14L, 29L, NA, 49L, 60L, NA, NA), other_party_1 = c(5L, 15L, 
    30L, 41L, 45L, 61L, NA, NA), other_party_2 = c(NA, 16L, 31L, 
    42L, 46L, 62L, NA, NA), other_party_3 = c(NA, 17L, 32L, NA, 
    50L, 63L, NA, NA), other_party_4 = c(NA, 18L, 33L, NA, 51L, 
    NA, NA, NA), other_party_5 = c(NA, 19L, 34L, NA, 52L, NA, 
    NA, NA), other_party_6 = c(NA, 20L, 35L, NA, 53L, NA, NA, 
    NA), other_party_7 = c(NA, 21L, 36L, NA, 54L, NA, NA, NA), 
    other_party_8 = c(NA, 22L, NA, NA, 55L, NA, NA, NA), other_party_9 = c(NA, 
    23L, NA, NA, NA, NA, NA, NA), other_party_10 = c(NA, 24L, 
    NA, NA, NA, NA, NA, NA), ideology_party_A = c(5L, 3L, 2L, 
    6L, 6L, 4L, 9L, 7L), ideology_party_B = c(9L, 0L, 5L, 4L, 
    5L, 9L, 4L, 3L), ideology_party_C = c(4L, 1L, 5L, 4L, 9L, 
    4L, 4L, 6L), ideology_party_D = c(8L, 2L, 0L, 8L, 4L, 5L, 
    1L, 6L), ideology_party_E = c(NA, 9L, 0L, NA, 0L, 1L, NA, 
    NA), ideology_other_party_1 = c(9L, 1L, 9L, 6L, 3L, 4L, NA, 
    NA), ideology_other_party_2 = c(NA, 7L, 8L, 3L, 7L, 7L, NA, 
    NA), ideology_other_party_3 = c(NA, 7L, 6L, NA, 0L, 7L, NA, 
    NA), ideology_other_party_4 = c(NA, 1L, 8L, NA, 1L, NA, NA, 
    NA), ideology_other_party_5 = c(NA, 6L, 7L, NA, 0L, NA, NA, 
    NA), ideology_other_party_6 = c(NA, 6L, 7L, NA, 9L, NA, NA, 
    NA), ideology_other_party_7 = c(NA, 1L, 8L, NA, 4L, NA, NA, 
    NA), ideology_other_party_8 = c(NA, 1L, NA, NA, 8L, NA, NA, 
    NA), ideology_other_party_9 = c(NA, 1L, NA, NA, NA, NA, NA, 
    NA), ideology_other_party_10 = c(NA, 8L, NA, NA, NA, NA, 
    NA, NA)), class = "data.frame", row.names = c(NA, -8L))

请注意,DATASET1 中各方的 ID 的顺序是 1,2,3 ... 但在向 PARTY A-E 发送应答时并不总是遵循此顺序。事实上,在我的真实数据中,它甚至不接近一个序列,我为每一方都有 5 位数的代码。这很重要,因为我需要根据“ID”列正确匹配 DATASET1 行中的每一方与 DATASET2 中的行。

对于剩余的各方(标签为“other_party”的列),顺序无关紧要(哪一方将变成“other_party_1”、“other_party_2”等),我只需要填写这些列来自未在标记为“甲方”、“乙方”等变量的变量中考虑的各方的数据。

编辑:答案中提供的解决方案适用于我的示例数据集,但对于我拥有的真实数据,它们会产生数十个凌乱的列。下面是我原始数据的一部分。我没有删除示例数据集,因为我找不到更好的方式来表达我想要的输出。

dataset1 <- structure(list(election = c("SWE_1998", "SWE_1998", "SWE_1998", 
"SWE_1998", "SWE_1998", "SWE_1998", "SWE_1998", "SWE_2002", "SWE_2002", 
"SWE_2002", "SWE_2002", "SWE_2002", "SWE_2002", "SWE_2002", "SWE_2006", 
"SWE_2006", "SWE_2006", "SWE_2006", "SWE_2006", "SWE_2006", "SWE_2006", 
"SWE_2010", "SWE_2010", "SWE_2010", "SWE_2010", "SWE_2010", "SWE_2010", 
"SWE_2010", "SWE_2010", "SWE_2014", "SWE_2014", "SWE_2014", "SWE_2014", 
"SWE_2014", "SWE_2014", "SWE_2014", "SWE_2014", "SWE_2018", "SWE_2018", 
"SWE_2018", "SWE_2018", "SWE_2018", "SWE_2018", "SWE_2018", "SWE_2018", 
"NOR_1997", "NOR_1997", "NOR_1997", "NOR_1997", "NOR_1997", "NOR_1997", 
"NOR_1997", "NOR_2001", "NOR_2001", "NOR_2001", "NOR_2001", "NOR_2001", 
"NOR_2001", "NOR_2001", "NOR_2005", "NOR_2005", "NOR_2005", "NOR_2005", 
"NOR_2005", "NOR_2005", "NOR_2005", "NOR_2009", "NOR_2009", "NOR_2009", 
"NOR_2009", "NOR_2009", "NOR_2009", "NOR_2009", "NOR_2013", "NOR_2013", 
"NOR_2013", "NOR_2013", "NOR_2013", "NOR_2013", "NOR_2013", "NOR_2013", 
"NOR_2017", "NOR_2017", "NOR_2017", "NOR_2017", "NOR_2017", "NOR_2017", 
"NOR_2017", "NOR_2017", "NOR_2017", "DNK_1998", "DNK_1998", "DNK_1998", 
"DNK_1998", "DNK_1998", "DNK_1998", "DNK_1998", "DNK_1998", "DNK_1998", 
"DNK_1998", "DNK_2001", "DNK_2001", "DNK_2001", "DNK_2001", "DNK_2001", 
"DNK_2001", "DNK_2001", "DNK_2001", "DNK_2005", "DNK_2005", "DNK_2005", 
"DNK_2005", "DNK_2005", "DNK_2005", "DNK_2005", "DNK_2005", "DNK_2005", 
"DNK_2007", "DNK_2007", "DNK_2007", "DNK_2007", "DNK_2007", "DNK_2007", 
"DNK_2007", "DNK_2007", "DNK_2011", "DNK_2011", "DNK_2011", "DNK_2011", 
"DNK_2011", "DNK_2011", "DNK_2011", "DNK_2011", "DNK_2015", "DNK_2015", 
"DNK_2015", "DNK_2015", "DNK_2015", "DNK_2015", "DNK_2015", "DNK_2015", 
"DNK_2015", "DNK_2019", "DNK_2019", "DNK_2019", "DNK_2019", "DNK_2019", 
"DNK_2019", "DNK_2019", "DNK_2019", "DNK_2019", "DNK_2019", "FIN_1999", 
"FIN_1999", "FIN_1999", "FIN_1999", "FIN_1999", "FIN_1999", "FIN_1999", 
"FIN_1999", "FIN_2003", "FIN_2003", "FIN_2003", "FIN_2003", "FIN_2003", 
"FIN_2003", "FIN_2003", "FIN_2003", "FIN_2007", "FIN_2007", "FIN_2007", 
"FIN_2007", "FIN_2007", "FIN_2007", "FIN_2007", "FIN_2007", "FIN_2011", 
"FIN_2011", "FIN_2011", "FIN_2011", "FIN_2011", "FIN_2011", "FIN_2011", 
"FIN_2011", "FIN_2015", "FIN_2015", "FIN_2015", "FIN_2015", "FIN_2015", 
"FIN_2015", "FIN_2015", "FIN_2015", "FIN_2019", "FIN_2019", "FIN_2019", 
"FIN_2019", "FIN_2019", "FIN_2019", "FIN_2019", "FIN_2019", "FIN_2019", 
"ISL_1999", "ISL_1999", "ISL_1999", "ISL_1999", "ISL_1999", "ISL_2003", 
"ISL_2003", "ISL_2003", "ISL_2003", "ISL_2003", "ISL_2007", "ISL_2007", 
"ISL_2007", "ISL_2007", "ISL_2007", "ISL_2009", "ISL_2009", "ISL_2009", 
"ISL_2009", "ISL_2009", "ISL_2013", "ISL_2013", "ISL_2013", "ISL_2013", 
"ISL_2013", "ISL_2013", "ISL_2016", "ISL_2016", "ISL_2016", "ISL_2016", 
"ISL_2016", "ISL_2016", "ISL_2016", "ISL_2017", "ISL_2017", "ISL_2017", 
"ISL_2017", "ISL_2017", "ISL_2017", "ISL_2017", "ISL_2017", "ISL_2017", 
"BEL_1999", "BEL_1999", "BEL_1999", "BEL_1999", "BEL_1999", "BEL_1999", 
"BEL_1999", "BEL_1999", "BEL_1999", "BEL_1999", "BEL_2003", "BEL_2003", 
"BEL_2003", "BEL_2003", "BEL_2003", "BEL_2003", "BEL_2003", "BEL_2003", 
"BEL_2003", "BEL_2003", "BEL_2007", "BEL_2007", "BEL_2007", "BEL_2007", 
"BEL_2007", "BEL_2007", "BEL_2007", "BEL_2007", "BEL_2007", "BEL_2007", 
"BEL_2007", "BEL_2007", "BEL_2007", "BEL_2010", "BEL_2010", "BEL_2010", 
"BEL_2010", "BEL_2010", "BEL_2010", "BEL_2010", "BEL_2010", "BEL_2010", 
"BEL_2010", "BEL_2010", "BEL_2014", "BEL_2014", "BEL_2014", "BEL_2014", 
"BEL_2014", "BEL_2014", "BEL_2014", "BEL_2019", "BEL_2019", "BEL_2019", 
"BEL_2019", "BEL_2019", "BEL_2019"), ID = c(11110, 11220, 11320, 
11420, 11520, 11620, 11810, 11110, 11220, 11320, 11420, 11520, 
11620, 11810, 11110, 11220, 11320, 11420, 11520, 11620, 11810, 
11110, 11220, 11320, 11420, 11520, 11620, 11710, 11810, 11110, 
11220, 11320, 11420, 11520, 11620, 11710, 11810, 11110, 11220, 
11320, 11420, 11520, 11620, 11710, 11810, 12221, 12320, 12420, 
12520, 12620, 12810, 12951, 12221, 12320, 12420, 12520, 12620, 
12810, 12951, 12221, 12320, 12420, 12520, 12620, 12810, 12951, 
12221, 12320, 12420, 12520, 12620, 12810, 12951, 12110, 12221, 
12320, 12420, 12520, 12620, 12810, 12951, 12110, 12221, 12230, 
12320, 12420, 12520, 12620, 12810, 12951, 13229, 13230, 13320, 
13330, 13410, 13420, 13520, 13620, 13720, 13951, 13229, 13230, 
13320, 13410, 13420, 13520, 13620, 13720, 13229, 13230, 13320, 
13330, 13410, 13420, 13520, 13620, 13720, 13001, 13229, 13230, 
13320, 13410, 13420, 13620, 13720, 13001, 13229, 13230, 13320, 
13410, 13420, 13620, 13720, 13001, 13110, 13229, 13230, 13320, 
13410, 13420, 13620, 13720, 13001, 13110, 13229, 13230, 13320, 
13410, 13420, 13620, 13720, 13730, 14110, 14223, 14320, 14520, 
14620, 14810, 14820, 14901, 14110, 14223, 14320, 14520, 14620, 
14810, 14820, 14901, 14110, 14223, 14320, 14520, 14620, 14810, 
14820, 14901, 14110, 14223, 14320, 14520, 14620, 14810, 14820, 
14901, 14110, 14223, 14320, 14520, 14620, 14810, 14820, 14901, 
14110, 14223, 14320, 14440, 14520, 14620, 14810, 14820, 14901, 
15111, 15328, 15420, 15620, 15810, 15111, 15328, 15420, 15620, 
15810, 15111, 15328, 15420, 15620, 15810, 15111, 15328, 15430, 
15620, 15810, 15111, 15328, 15440, 15620, 15810, 15952, 15111, 
15328, 15440, 15450, 15620, 15810, 15952, 15111, 15328, 15440, 
15450, 15620, 15630, 15810, 15952, 15953, 21111, 21112, 21321, 
21322, 21421, 21425, 21521, 21522, 21914, 21915, 21111, 21112, 
21221, 21322, 21421, 21426, 21521, 21522, 21914, 21916, 21111, 
21112, 21221, 21321, 21322, 21330, 21421, 21426, 21430, 21521, 
21522, 21916, 21917, 21111, 21112, 21321, 21322, 21421, 21426, 
21430, 21521, 21522, 21916, 21917, 21112, 21230, 21321, 21421, 
21521, 21916, 21917, 21112, 21230, 21321, 21421, 21521, 21916
), ideology = c(-36.111, -35.952, -3.516, 14.286, 4.79, 37.425, 
11.57, -26.087, -33.661, -18.315, 0.932, 6.325, 38.061, 10.646, 
-11.616, -35.99, -24.173, 14.545, 0.806, 3.963, -4.459, -9.16, 
-12.205, -32.27, -4.803, 8.142, 2.479, 15.686, -2.24, -26.157, 
-33.889, -52.67, -2.523, 4.884, -16.748, -6.646, 7.895, -15.966, 
-40.701, -20, -1.144, -12.712, 7.562, -9.091, 9.978, -25.363, 
-18.112, -7.897, -4.549, 3.692, -10.553, 23.478, -44.022, -38.182, 
-15.502, -18.568, 9.789, -27.265, 23.963, -38.041, -33.293, -23.796, 
-24.37, 13.379, -17.608, 16.945, -40.106, -29.788, -18.531, -11.078, 
-11.405, -20.411, 6.763, -17.939, -28.267, -17.986, -15.495, 
-12.959, -9.011, -17.523, -1.945, -11.046, -28.961, -32.344, 
-29.793, -13.377, -12.328, -7.808, -16.705, 14.162, -32.479, 
-39.59, -1.042, -14.019, -5.455, 28.571, 43.21, 18.672, 9.722, 
34, -10.692, -33.846, -13.422, -3.774, 36.232, 24.675, 20.37, 
35, -42.152, -40.832, -36.332, -10.938, 0, -2.372, -3.883, 9.714, 
38, -12.5, -33.003, -37.143, -8.547, -9.615, -6.977, -17.355, 
14.894, 51.724, -41.778, -45.418, -6.509, -0.787, -13.717, 47.887, 
30.925, 28.704, -29.697, -46.429, -64.249, -2.091, 6.25, 17.822, 
60, 18.75, 15.534, -34.946, -38.182, -29.027, -18.437, -19.516, 
-17.483, -7.202, 32.979, 2.933, -6.25, -38.168, -1.37, 19.444, 
29.464, -1.049, -5.882, 14.516, -33.523, -45.946, -24.742, 7.813, 
9.756, -7.636, -5.882, -19.931, -21.471, -42.051, -36.432, -15.108, 
-20.556, -15.09, -6.518, -25.472, -27.715, -44.767, -11.384, 
-16.771, 13.75, -16.383, 0.472, -23.392, -37.05, -42.781, -27.016, 
4.967, -12.535, -4.348, -4.936, -20.865, -38.601, -41.021, -23.413, 
-32.222, -9.481, 1.2, -21.687, -13.809, -14.199, -32.5, -19.38, 
5.505, 18.182, -9.767, -22.222, -21.801, 15.556, 3.797, -11.558, 
-23.188, -24.286, -0.617, 3.797, -15.086, 1.389, -10, -1.613, 
39.506, -7.895, -32.71, -11.017, -6.633, 13.445, -17.094, -40, 
-29.679, -27.073, -15.205, -11.207, 8.916, -6.25, -23.022, -28.625, 
-30.189, -14.706, -11.207, -0.628, NA, -55, -26.104, -41.333, 
-19.763, -16.68, -1.429, -14.869, 5.556, -7.805, -4.185, -11.928, 
-2.997, -6.612, -17.336, -21.575, -13.571, -25.309, 0.373, -29.641, 
1.869, -12.133, -2.997, -7.576, -20.32, -3.753, -3.646, -26.752, 
-32.261, -17.939, 13.488, -20.861, 33.782, 11.393, -26.769, 27.51, 
24.571, -31.299, -0.855, -12.609, -26.688, 12.726, -0.2, 41.463, 
7.248, -24.555, 11.691, 39.443, -18.063, -34.785, -15.502, -3.859, 
-0.102, 8.584, 17.3, -21.849, -33.681, -19.199, -8, -11.903, 
4.78)), row.names = c(NA, -300L), class = c("tbl_df", "tbl", 
"data.frame"))


dataset2 <- structure(list(election = c("ALB_2005", "ARG_2015", "AUS_1996", 
"AUS_2004", "AUS_2007", "AUS_2013", "AUT_2008", "AUT_2013", "BLR_2001", 
"BLR_2008", "BEL_2003", "BELF1999", "BELW1999", "BRA_2002", "BRA_2006", 
"BRA_2010", "BRA_2014", "BGR_2001", "BGR_2014", "CAN_1997", "CAN_2004", 
"CAN_2008", "CAN_2011", "CAN_2015", "CHL_1999", "CHL_2005", "CHL_2009", 
"HRV_2007", "CZE_1996", "CZE_2002", "CZE_2006", "CZE_2010", "CZE_2013", 
"DNK_1998", "DNK_2001", "DNK_2007", "EST_2011", "FIN_2003", "FIN_2007", 
"FIN_2011", "FIN_2015", "FRA_2002", "FRA_2007", "FRA_2012", "DEU_1998", 
"DEU_2005", "DEU_2009", "DEU_2013", "DEU12002", "DEU22002", "GBR_1997", 
"GBR_2005", "GBR_2015", "GRC_2009", "GRC_2012", "GRC_2015", "HKG_1998", 
"HKG_2000", "HKG_2004", "HKG_2008", "HKG_2012", "HUN_1998", "HUN_2002", 
"ISL_1999", "ISL_2003", "ISL_2007", "ISL_2009", "ISL_2013", "IRL_2002", 
"IRL_2007", "IRL_2011", "ISR_1996", "ISR_2003", "ISR_2006", "ISR_2013", 
"ITA_2006", "JPN_1996", "JPN_2004", "JPN_2007", "JPN_2013", "KEN_2013", 
"KGZ_2005", "LVA_2010", "LVA_2011", "LVA_2014", "LTU_1997", "MEX_1997", 
"MEX_2000", "MEX_2003", "MEX_2006", "MEX_2009", "MEX_2012", "MEX_2015", 
"MNE_2012", "NLD_1998", "NLD_2002", "NLD_2006", "NLD_2010", "NZL_1996", 
"NZL_2002", "NZL_2008", "NZL_2011", "NZL_2014", "NOR_1997", "NOR_2001", 
"NOR_2005", "NOR_2009", "NOR_2013", "PER_2000", "PER_2001", "PER_2006", 
"PER_2011", "PER_2016", "PHL_2004", "PHL_2010", "PHL_2016", "POL_1997", 
"POL_2001", "POL_2005", "POL_2007", "POL_2011", "PRT_2002", "PRT_2005", 
"PRT_2009", "PRT_2015", "KOR_2000", "KOR_2004", "KOR_2008", "KOR_2012", 
"ROU_1996", "ROU_2004", "ROU_2009", "ROU_2012", "ROU_2014", "RUS_1999", 
"RUS_2000", "RUS_2004", "SRB_2012", "SVK_2010", "SVK_2016", "SVN_1996", 
"SVN_2004", "SVN_2008", "SVN_2011", "ZAF_2009", "ZAF_2014", "ESP_1996", 
"ESP_2000", "ESP_2004", "ESP_2008", "SWE_1998", "SWE_2002", "SWE_2006", 
"SWE_2014", "CHE_1999", "CHE_2003", "CHE_2007", "CHE_2011", "TWN_1996", 
"TWN_2001", "TWN_2004", "TWN_2008", "TWN_2012", "THA_2001", "THA_2007", 
"THA_2011", "TUR_2011", "TUR_2015", "UKR_1998", "USA_1996", "USA_2004", 
"USA_2008", "USA_2012", "URY_2009"), party_ID_A = c(75624, 999999, 
63320, 63620, 63320, 63620, 42320, 42320, 78211, 78211, 21421, 
999999, 999999, 999999, 999999, 999999, 999999, 80902, 80510, 
62420, 62420, 62623, 62623, 62420, 999999, 999999, 999999, 81711, 
82413, 82320, 82413, 82320, 82320, 13320, 13420, 13420, 83430, 
14810, 14810, 14620, 14810, 31625, 31626, 31320, 41320, 41320, 
41521, 41521, 41320, 41320, 51320, 51320, 51620, 34313, 34511, 
34212, 999999, 999999, 999999, 999999, 999999, 86220, 86220, 
15620, 15620, 15620, 999999, 15620, 53620, 53620, 53520, 72323, 
72622, 72430, 999999, 32610, 71620, 71624, 71624, 71620, 999999, 
999999, 87062, 87021, 87340, 999999, 171301, 171601, 171601, 
171601, 171301, 171301, 171301, 91020, 22320, 22521, 22521, 22420, 
64620, 64320, 64620, 64620, 64620, 12320, 12320, 12320, 12320, 
12320, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
999999, 92620, 92212, 92436, 92435, 92435, 35313, 35311, 35311, 
35060, 113630, 113422, 113630, 113630, 93411, 93222, 93530, 93031, 
999999, 94221, 94221, 94951, 95070, 96423, 96423, 97421, 97330, 
97322, 97340, 181310, 181310, 33610, 33610, 33320, 33320, 11320, 
11320, 11320, 11320, 43810, 43810, 43810, 43810, 999999, 999999, 
999999, 999999, 999999, 999999, 999999, 999999, 74628, 74628, 
98221, 61320, 61620, 61320, 61320, 999999), party_ID_B = c(75220, 
999999, 63620, 63320, 63620, 63320, 42520, 42520, 78212, 78212, 
21221, 999999, 999999, 999999, 999999, 999999, 999999, 80411, 
80221, 62621, 62623, 62420, 62320, 62623, 999999, 999999, 999999, 
81220, 82320, 82413, 82320, 82413, 82430, 13420, 13320, 13320, 
83411, 14320, 14620, 14320, 14620, 31720, 31320, 31626, 41521, 
41521, 41320, 41320, 41521, 41521, 51620, 51620, 51320, 34511, 
34212, 34511, 999999, 999999, 999999, 999999, 999999, 86421, 
86421, 999999, 999999, 999999, 15620, 15810, 53520, 53520, 53320, 
72622, 72323, 72323, 72440, 32220, 71623, 71620, 71620, 71624, 
999999, 999999, 87021, 87620, 87062, 999999, 171601, 171301, 
171301, 171305, 171601, 171601, 171601, 91060, 22420, 22720, 
22320, 22320, 64320, 64620, 64320, 64320, 64320, 12951, 12620, 
12951, 12951, 12620, 999999, 999999, 999999, 999999, 999999, 
999999, 999999, 999999, 92210, 92435, 92435, 92436, 92436, 35311, 
35313, 35313, 35311, 113430, 113630, 113440, 113440, 93223, 93430, 
93002, 93061, 999999, 94620, 94620, 94221, 95430, 96523, 96440, 
97521, 97421, 97330, 97330, 181411, 181411, 33320, 33320, 33610, 
33610, 11620, 11620, 11620, 11620, 43320, 43320, 43320, 43320, 
999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
74321, 74321, 98611, 61620, 61320, 61620, 61620, 999999), party_ID_C = c(75722, 
999999, 63810, 63110, 63810, 63110, 42420, 42420, 999999, 999999, 
21521, 999999, 999999, 999999, 999999, 999999, 999999, 80220, 
80951, 62620, 62320, 62901, 62420, 62320, 999999, 999999, 999999, 
81712, 82220, 82220, 82220, 82530, 82220, 13620, 13720, 13720, 
83611, 14620, 14320, 14820, 14820, 31320, 31624, 31720, 41521, 
41420, 41420, 41223, 41521, 41521, 51421, 51421, 51951, 34210, 
34313, 34720, 999999, 999999, 999999, 999999, 999999, 86810, 
86422, 15810, 15810, 15111, 15111, 999999, 53320, 53320, 53620, 
72533, 72413, 72533, 72323, 32710, 71624, 999999, 999999, 71220, 
999999, 999999, 87110, 87062, 87110, 88621, 171305, 171031, 171305, 
171301, 171305, 171305, 171305, 91224, 22521, 22420, 22220, 22722, 
64621, 64621, 64110, 64110, 64110, 12620, 12951, 12620, 12620, 
12951, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
999999, 92434, 92622, 92622, 92021, 92440, 35520, 35229, 35520, 
35211, 113650, 113320, 113651, 113321, 93322, 93221, 93430, 93981, 
999999, 94622, 94622, 94711, 95221, 96440, 96620, 97320, 97322, 
97440, 97322, 181420, 181210, 33220, 33220, 33220, 33611, 11220, 
11420, 11810, 11710, 43420, 43420, 43420, 43420, 999999, 999999, 
999999, 999999, 999999, 999999, 999999, 999999, 74712, 74712, 
98321, 999999, 999999, 999999, 999999, 999999), party_ID_D = c(75320, 
999999, 63321, 63810, 63110, 63410, 42710, 42110, 999999, 999999, 
21322, 999999, 999999, 999999, 999999, 999999, 999999, 80951, 
80061, 62320, 62901, 62320, 62901, 62901, 999999, 999999, 999999, 
81810, 82523, 82523, 82523, 82220, 82530, 13230, 13620, 13230, 
83410, 14223, 14223, 14810, 14320, 31624, 31720, 31021, 41113, 
41222, 41223, 41113, 41113, 41113, 51902, 51902, 51421, 34710, 
34730, 34340, 999999, 999999, 999999, 999999, 999999, 86422, 
86620, 15111, 15111, 15810, 15810, 15111, 53951, 53110, 53951, 
72530, 72533, 72622, 72701, 32421, 71220, 71220, 71220, 999999, 
999999, 999999, 87071, 87071, 87071, 88320, 171101, 171306, 171101, 
171101, 171101, 171101, 171210, 91330, 22330, 22320, 22420, 22521, 
64321, 64420, 64621, 64621, 64621, 12520, 12221, 12221, 12221, 
12520, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
999999, 92811, 92436, 92210, 92811, 92811, 35229, 35520, 35211, 
35229, 999999, 113430, 999999, 113651, 93951, 93712, 93712, 93951, 
93981, 94621, 94621, 999999, 95712, 96521, 96710, 97520, 97522, 
97951, 97450, 181910, 181910, 33611, 33611, 33611, 33902, 11520, 
11520, 11420, 11110, 43520, 43520, 43520, 43520, 999999, 999999, 
999999, 999999, 999999, 999999, 999999, 999999, 74325, 74210, 
98111, 999999, 999999, 999999, 999999, 999999), party_ID_E = c(999999, 
999999, 63110, 999999, 999999, 63810, 42110, 42710, 999999, 999999, 
21914, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
80062, 62901, 62110, 62110, 62110, 62110, 999999, 999999, 999999, 
81957, 82710, 999999, 82110, 82952, 82413, 13720, 13230, 13620, 
83612, 999999, 999999, 14223, 999999, 999999, 31220, 31624, 41420, 
41113, 41113, 41521, 41420, 41420, 51901, 51901, 51902, 34020, 
34720, 34210, 999999, 999999, 999999, 999999, 999999, 86620, 
999999, 15420, 15420, 15420, 15430, 15440, 53420, 53951, 53021, 
72326, 72624, 72625, 72533, 32530, 71320, 71320, 71320, 71430, 
999999, 999999, 87061, 87110, 87630, 999999, 171306, 171101, 
171306, 171306, 171306, 171306, 171101, 91920, 22110, 22110, 
22722, 22220, 64420, 64110, 64420, 999999, 999999, 12810, 12520, 
12520, 12810, 12810, 999999, 999999, 999999, 999999, 999999, 
999999, 999999, 999999, 92621, 92811, 92713, 999999, 92210, 35211, 
35211, 35229, 35120, 113620, 113650, 113320, 999999, 93712, 93951, 
93951, 93712, 93712, 999999, 999999, 94621, 95431, 96955, 96720, 
97321, 97521, 97710, 97951, 999999, 999999, 33902, 33902, 33905, 
33905, 11810, 11220, 11520, 11810, 43110, 43110, 43110, 43110, 
999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
74717, 74717, 98426, 999999, 999999, 999999, 999999, 999999), 
    party_ID_F = c(999999, 999999, 999999, 63321, 999999, 999999, 
    42421, 42430, 999999, 999999, 21426, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 80630, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 81713, 82412, 999999, 
    999999, 82523, 82720, 13330, 13410, 13410, 83110, 14520, 
    14901, 999999, 14223, 999999, 31110, 31110, 41221, 41521, 
    41521, 41420, 41221, 41221, 999999, 999999, 51110, 999999, 
    34213, 34730, 999999, 999999, 999999, 999999, 999999, 999999, 
    86521, 999999, 999999, 15328, 15420, 15952, 53110, 53420, 
    53110, 999999, 72326, 72530, 72535, 32212, 71951, 999999, 
    999999, 999999, 999999, 999999, 87422, 999999, 87901, 999999, 
    171304, 171303, 171311, 171311, 171309, 171309, 171311, 999999, 
    22220, 22220, 22110, 22330, 999999, 64421, 64901, 64901, 
    64902, 12221, 12810, 12810, 12520, 12420, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 92322, 92713, 
    92811, 999999, 999999, 999999, 35220, 999999, 999999, 999999, 
    999999, 999999, 113321, 93711, 93001, 999999, 999999, 93951, 
    94422, 94422, 94422, 95451, 96710, 96725, 97951, 97710, 999999, 
    97521, 999999, 999999, 33907, 999999, 33902, 33220, 11420, 
    11810, 11220, 11220, 43531, 999999, 43530, 43530, 999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 98810, 999999, 999999, 999999, 999999, 999999), party_ID_G = c(75810, 
    999999, 999999, 999999, 999999, 999999, 999999, 42951, 78710, 
    999999, 21522, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 80710, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 81410, 999999, 999999, 999999, 999999, 82523, 
    999999, 13229, 13001, 999999, 14901, 14520, 14901, 14901, 
    31110, 999999, 999999, 999999, 999999, 999999, 41953, 999999, 
    999999, 999999, 999999, 51901, 999999, 34210, 34313, 999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 72431, 999999, 999999, 999999, 999999, 71111, 999999, 
    999999, 999999, 87422, 999999, 88420, 999999, 999999, 999999, 
    171309, 171311, 171311, 171309, 999999, 22527, 22330, 22526, 
    22110, 999999, 64422, 64422, 64902, 64901, 999999, 12420, 
    12420, 12420, 12221, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 92620, 999999, 999999, 999999, 
    999999, 35110, 999999, 999999, 999999, 999999, 113321, 999999, 
    93430, 999999, 999999, 93222, 999999, 999999, 999999, 94222, 
    95711, 96952, 96955, 97710, 97951, 97421, 97522, 999999, 
    999999, 999999, 999999, 33907, 33908, 999999, 11110, 11110, 
    11420, 999999, 999999, 43531, 43901, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 74626, 999999, 98427, 
    999999, 999999, 999999, 999999, 999999), party_ID_H = c(75421, 
    999999, 999999, 999999, 999999, 999999, 999999, 42220, 999999, 
    999999, 21916, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 80330, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 81952, 999999, 999999, 999999, 82110, 82110, 
    999999, 13520, 13229, 999999, 999999, 14820, 14520, 14520, 
    999999, 31630, 999999, 999999, 999999, 999999, 41952, 999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 72326, 999999, 999999, 999999, 999999, 71320, 999999, 
    999999, 999999, 999999, 999999, 88220, 999999, 999999, 999999, 
    171310, 171310, 999999, 171611, 999999, 999999, 22526, 22330, 
    22526, 999999, 64321, 64421, 64420, 64420, 999999, 999999, 
    999999, 999999, 12110, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 92434, 999999, 999999, 92953, 
    999999, 999999, 999999, 35520, 999999, 999999, 999999, 999999, 
    999999, 93521, 999999, 93430, 999999, 999999, 999999, 999999, 
    95902, 96711, 96630, 999999, 999999, 97522, 97710, 999999, 
    181420, 999999, 999999, 33908, 999999, 999999, 999999, 11710, 
    11520, 999999, 999999, 43901, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 74621, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999), party_ID_I = c(999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 21111, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 81953, 999999, 999999, 999999, 999999, 82953, 
    999999, 13330, 13520, 999999, 999999, 999999, 999999, 999999, 
    31220, 31230, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 72901, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 171306, 999999, 999999, 22952, 22952, 
    22952, 999999, 999999, 999999, 64421, 64421, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 92322, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 93530, 999999, 999999, 999999, 999999, 
    999999, 96220, 96521, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 33440, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 999999, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999, 74324, 999999, 999999, 
    999999, 999999, 999999, 999999, 999999)), row.names = c(NA, 
-174L), class = c("tbl_df", "tbl", "data.frame"))

PS:我不需要未包含在 dataset2 中的“选举”(即国家/地区/年份)信息,以防万一有助于找到更好的代码。

【问题讨论】:

  • dataset1 中,我找到了阿根廷的 9 个派对(ID1 到 9),而我在 output 中只找到了 6 个派对(ID1 到 6)。是偶然的还是故意的?
  • 这是故意的。各方并不总是相同,顺序也不相同,甚至“国家”在我的真实数据集中也不对应(实际上真实数据集有国家/年,而不仅仅是国家)。
  • 您如何定义从输出中删除的未包含在 A-E 方中的各方(对于阿根廷的情况,ID7-9 被丢弃)?实际上,仅在阿根廷发现了这种辍学。

标签: r tidyr


【解决方案1】:

我们可以在join函数中指定几个键列作为by参数。
因此,以下代码将提供预期的输出。

output <- dataset1 %>% left_join(dataset2 %>% pivot_longer(cols=-country, values_to="ID"), by=c("country", "ID")) %>%
  arrange(country, name) %>% nest(data=-country) %>% mutate(data=map(data, function(data){
    data %>% filter(is.na(name)) %>% mutate(name=str_c("other_party_", row_number())) %>%
      bind_rows(data %>% filter(!is.na(name)), .) %>% return()
  })) %>% unnest(cols=data) %>% pivot_longer(cols=c(ID, ideology), names_to="type") %>% arrange(type) %>%
  mutate(name=if_else(type=="ID", name, str_c(type, "_", str_replace(name, ".ID", ""))) %>% as_factor()) %>%
  select(-type) %>% pivot_wider()

更新:
在您的真实数据集中,我发现几个 election 项目仅在 dataset1(例如 BEL_1999)或仅在 dataset2(例如 BELF1999)中。那么您应该使用full_join 而不是left_join 来保留所有项目。
而且我认为dataset2 中的999999 应该事先转换为NA。

因此,以下代码可以正常工作。

dataset1 %>% full_join(dataset2 %>% pivot_longer(cols=-election, values_to="ID"), by=c("election", "ID")) %>%
  arrange(election, name) %>% nest(data=-election) %>% mutate(data=map(data, function(data){
    data %>% filter(is.na(name)) %>% mutate(name=str_c("other_party_", row_number())) %>%
      bind_rows(data %>% filter(!is.na(name)), .) %>% return()
  })) %>% unnest(cols=data) %>% pivot_longer(cols=c(ID, ideology), names_to="type") %>% arrange(type) %>%
  mutate(name=if_else(type=="ID", name, str_c(type, "_", str_replace(name, "_ID", ""))) %>% as_factor(),
         value=if_else(value==999999, NA_real_, value)) %>%
  select(-type) %>% pivot_wider() %>%
  select(election, starts_with("party"), starts_with("other"),
         starts_with("ideology_party"), starts_with("ideology_other"))

【讨论】:

  • 谢谢,很抱歉花了这么长时间来回答。我试图了解这里的所有输出。它确实适用于假数据,但在我的真实数据集中它不能正常工作。对于我上面描述的子集,它正确地从 dataset1 中为“party_A_ideology”等带来了数据,但它没有带来额外的数据(那些在“party_ID 中不匹配并且应该包含在“other_party_1”中的那些等等。请参阅我在真实数据样本中包含代码的编辑。
  • @GuilhermePiresArbache 我更新了我的答案。如果效果不佳,请提供您的预期输出,或指出具体的elections 和IDs 不正确。
  • 感谢所有的努力。它与我上面给出的数据集示例、假数据集和我拥有的真实数据集样本(这是“真实”数据集 1 的 30% 和“真实”数据集 2 的完整版本)完美配合。但是当我尝试使用整个数据时,它仍然会产生一个混乱的数据集:“其他方”的数百列,如果这对您有帮助的话:其中一些列带有“未知”类和警告消息:Values are not uniquely identified; output will contain list-cols.
  • 这可能与“完全连接”有关。正如我在上一次编辑中所写,我不需要数据集 2 中不包含的选举(但如果数据集 2 中包含的选举中,我确实需要来自数据集 1 的 PARTIES - 这些将是“其他方)。但我不是确定为什么在这里有很多“选举”会产生这种混乱。不过,我尝试了使用更简洁的 dataset1 版本的代码,包括仅来自 dataset2 的选举,这是我需要的((841 行)。它似乎产生了所需的输出列,但仍然带有警告消息和“未知”类。
  • 因此,对于我的实际使用,我想我现在有了它,这要归功于你的代码。但也许我应该编辑这个问题 - 删除虚假数据并更清楚地说明期望的输出是什么以及发生了什么问题?
【解决方案2】:

也许,您可以尝试更正dataset1 中每个countryID 数字,并获取宽格式数据,然后将其与dataset2 连接。

library(dplyr)
library(tidyr)

dataset1 %>%
  group_by(country) %>%
  mutate(ID = row_number()) %>%
  pivot_wider(names_from = ID, values_from = ideology, names_prefix = 'ideology') %>%
  inner_join(dataset2, by = 'country') -> result

result

【讨论】:

  • 不可能。正如我在底部所说,索引不是按 1、2、3 的顺序排列的,它们是 5 位的方代码。我只是用这种方式使它在示例中更简单。更正所有 ID 将花费我永远的时间。这就是问题所在。
  • 我并没有在我的答案中手动更正 ID。所以我不确定到底是什么问题。
  • 对不起,你是对的。但由于某种原因,这些代码无法与我的真实数据集一起正常工作。我试图找出与我上面提供的示例数据集有什么不同。
  • 您可能需要共享更好的数据表示或共享实际数据的子集。
  • 是的,我知道。我只是想让事情变得更容易,但我想情况恰恰相反。请参阅上面的编辑,其中包含来自真实数据集的样本。如果我只用部分真实数据和所需输出编辑整个问题,然后删除虚假数据,会有帮助吗?
猜你喜欢
  • 1970-01-01
  • 2019-07-15
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2013-10-27
相关资源
最近更新 更多