让我们 NA 值的处理取决于它们相对于数据框中组之间可用值的数量(以 R 为单位)



我有一个包含状态之间契约的数据集。缔约国的数量从2个到94个不等。在另一个数据框中,每个状态都被赋予一个称为"polity"的值 - 尽管对于某些人来说,缺少此值。

在这个论坛的帮助下,我合并了两个数据框架,然后通过取缔约国的min()和max()"polity"值的差值来总结合同。

现在,我不想忽略或排除 NA 值。如果缔约国之间的NA值数量超过缔约国数量的一定比例,我想将合同的政体值视为NA(对于这些数据框,最方便的说法是必须有4/5的政体值可用才能在分析中采用合同)。

这是我的数据集的两个简化版本:

treaties <- data.frame(treaty.ID=c(1,1,2,2,3,3,3,4,4,4,4,4),
                   Treaty=c("hungary slovenia 1994", "hungary slovenia 1994",
                            "taiwan hungary 1994", "taiwan hungary 1994", 
                            "Treaty of Izmir 1977", "Treaty of Izmir 1977",
                            "Treaty of Izmir 1977", "Treaty of Five 1909", 
                            "Treaty of Five 1909", "Treaty of Five 1909",
                            "Treaty of Five 1909","Treaty of Five 1909"),
                   scode=c("HUN","SLV","TAW","HUN", "IRN", "TUR", "PAK", 
                           "AUS","AUL","NEW","USA","CAN"),
                   year=c(1994, 1994, 1994, 1994, 1977, 1977, 1977, 1909, 
                          1909, 1909, 1909, 1909),
                   pr.dem=c(1,1,0,0,0,0,0,1,1,1,1,1))
POL <- data.frame(country=c("Hungary", "Slovenia", "Taiwan","Austria",
                           "Australia", "New Zealand", "USA", "Canada",
                           "Iran","Turkey", "Pakistan"),
                 scode=c("HUN", "SLV", "TAW", "AUS", "AUL", "NEW", "USA",
                         "CAN", "IRN", "TUR", "PAK"),
                 year=c(1994, 1994, 1994, 1909, 1909, 1909, 1909, 1909,
                        1977, 1977, 1977),
                 polity = c(7, NA, 9, 8, 8, 10, 10, NA, -10, 9, NA))

(因此,只有条约1和条约3最终应显示NA为"政体")

我将它们连接在一起,将具有相同条约的多行减少为一行,同时取政体值的最大值和最小值的差值:

require(dplyr)
left_join(treaties, POL, c("scode","year")) %>%
                                group_by(Treaty) %>% 
                               summarise(PolityDiff=max(polity)-min(polity))

我想知道是否可以让 NA 值的处理取决于它们的数量,而不是分组数据框中可用值的数量?

我试图包含一个ifelse函数:

DIFF <- left_join(treaties, Polity, c("scode","year")) %>%
                       group_by(DIFF, File)
summarise(DIFF, polity.Diff=max(polity, na.rm = ifelse(length(polity = NA) >= 0.2*length(polity), TRUE, FALSE))-
            min(polity, na.rm = ifelse(length(polity = NA) >= 0.2*length(polity), TRUE, FALSE)))

但它返回错误:

Error: index out of bounds

我可以在 "na.rm = " 之后使用 ifelse() 函数吗?我搞错了吗?我真的很感激你的帮助。

这应该可以做你想要的:

left_join(treaties, POL, c("scode","year")) %>%
  group_by(Treaty) %>%
  summarise(polity.Diff = max(polity, na.rm = sum(is.na(polity)) >= 0.2*n()) -
                          min(polity, na.rm = sum(is.na(polity)) >= 0.2*n()))
#Source: local data frame [4 x 2]
#
#                 Treaty polity.Diff
#1 hungary slovenia 1994           0
#2   taiwan hungary 1994           2
#3   Treaty of Five 1909           2
#4  Treaty of Izmir 1977          19

首先,我使用 is.na() 而不是 length(XX = NA) ,其次我使用 dplyr 的特殊函数n()而不是 length(polity) 第三,我删除了ifelse,只在那里留下了逻辑测试 - 它将根据规范返回 TRUE 或 FALSE。请注意,在其中 3 种情况下,NA 将被删除,而在一种情况下(台湾匈牙利 1994 年),它们不会被删除,因为该组中根本没有 NA - 这就是为什么您最终polity.Diff列中没有任何 NA。

您可能会注意到,您对maxmin执行相同的逻辑测试 - 通过首先在数据中创建新变量(例如 NAcheck),然后在na.rm =定义中引用该变量,可以更有效地解决。但是,您还需要在之后删除该变量(例如使用 select(-NAcheck) )。

相关内容

最新更新