gpt4 book ai didi

仅当行重复时才删除在特定列中包含 NA 的行(基于其他两列)

转载 作者:行者123 更新时间:2023-12-03 23:26:17 24 4
gpt4 key购买 nike

我有一个数据框,它是左连接的结果。下面提供了示例数据:

   P.I.D..     Status List.year CURRENT_LAND_VALUE CURRENT_IMPROVEMENT_VALUE
<chr> <chr> <dbl> <dbl> <dbl>
1 003-913-627 X 2000 NA NA
2 003-913-627 T 2010 1578000 1201000
3 003-913-627 S 2018 NA NA
4 003-913-627 S 2018 2814000 901000
5 003-913-627 S 2002 NA NA
6 003-913-627 T 2007 390000 282000
7 003-913-627 T 2007 295000 180000
8 003-913-627 S 2008 464000 391000
9 003-913-627 S 2008 339000 246000
10 003-913-627 X 2009 339000 246000
11 003-913-627 X 2009 464000 391000
抱歉,我尝试使用 dput为数据生成代码,但是当我尝试时,它给了我一些不相关的结果,这些结果不代表上面显示的表格
可以看出 年份 2018 和 PID 003-913-627,显示两行。一个号码是 CURRENT_LAND_VALUE CURRENT_IMPROVEMENT_VALUE 一行包括 NA。我想要做的是删除具有 NA 值的行 仅当 该行是重复的(这意味着我们还有另一行具有相同的 PID List.year
在某些情况下,如第一行,因为没有与 相同的行PID 003-913-627 和 列表.年份 2000 不应该删除 NA。上述数据框的预期结果是:
   P.I.D..     Status List.year CURRENT_LAND_VALUE CURRENT_IMPROVEMENT_VALUE
<chr> <chr> <dbl> <dbl> <dbl>
1 003-913-627 X 2000 NA NA
2 003-913-627 T 2010 1578000 1201000
4 003-913-627 S 2018 2814000 901000
5 003-913-627 S 2002 NA NA
6 003-913-627 T 2007 390000 282000
7 003-913-627 T 2007 295000 180000
8 003-913-627 S 2008 464000 391000
9 003-913-627 S 2008 339000 246000
10 003-913-627 X 2009 339000 246000
11 003-913-627 X 2009 464000 391000
总之:我想删除在“CURRENT_LAND_VALUE”和“CURRENT_IMPROVEMENT_VALUE”中有NA的行,只有当已经有一个具有相同“PID”和“List.Year”的行具有“CURRENT_IMPROVEMENT_VALUE”或“CURRENT_LAND_VALUE”的实际值时
我怎样才能做到这一点?

最佳答案

summarise分组后可以在这里用作 dplyr版本>= 1.0每组可以返回多于一行。在这里,我们可以使用分组列,然后做summarise across如果其中至少一个是非 NA 则返回非 NA 元素的数字列,否则返回 NA

library(dplyr)
df1 %>%
group_by(`P.I.D..`, Status, List.year) %>%
summarise(across(where(is.numeric),
~ if(all(is.na(.))) NA_real_ else .[complete.cases(.)]), .groups = 'drop')
-输出
# A tibble: 10 x 5
# P.I.D.. Status List.year CURRENT_LAND_VALUE CURRENT_IMPROVEMENT_VALUE
# <chr> <chr> <int> <dbl> <dbl>
# 1 003-913-627 S 2002 NA NA
# 2 003-913-627 S 2008 464000 391000
# 3 003-913-627 S 2008 339000 246000
# 4 003-913-627 S 2018 2814000 901000
# 5 003-913-627 T 2007 390000 282000
# 6 003-913-627 T 2007 295000 180000
# 7 003-913-627 T 2010 1578000 1201000
# 8 003-913-627 X 2000 NA NA
# 9 003-913-627 X 2009 339000 246000
#10 003-913-627 X 2009 464000 391000
详情- across循环多列。在其中,第一个表达式可以是感兴趣的列。我们可以使用 everything()如果所有其余的列都需要循环或表达式来检查 type的列,如果它满足只做循环( where(is.numeric) ),然后我们创建一个 lamdba 表达式( ~ - function(x) 等效),并使用一些条件 if/else .它可能不需要,但是当某些列只有 NA 时,它只是防止它失败的一个选项。 .在 else ,我们使用非 NA 元素( .[complete.cases(.)] )对列进行子集化。
一个假设是它会为每一列返回相同的长度,否则可以用 list 包裹起来。
数据
df1 <- structure(list(P.I.D.. = c("003-913-627", "003-913-627", "003-913-627", 
"003-913-627", "003-913-627", "003-913-627", "003-913-627", "003-913-627",
"003-913-627", "003-913-627", "003-913-627"), Status = c("X",
"T", "S", "S", "S", "T", "T", "S", "S", "X", "X"), List.year = c(2000L,
2010L, 2018L, 2018L, 2002L, 2007L, 2007L, 2008L, 2008L, 2009L,
2009L), CURRENT_LAND_VALUE = c(NA, 1578000L, NA, 2814000L, NA,
390000L, 295000L, 464000L, 339000L, 339000L, 464000L),
CURRENT_IMPROVEMENT_VALUE = c(NA,
1201000L, NA, 901000L, NA, 282000L, 180000L, 391000L, 246000L,
246000L, 391000L)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11"))

关于仅当行重复时才删除在特定列中包含 NA 的行(基于其他两列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65515077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com