【发布时间】:2017-02-02 08:53:02
【问题描述】:
我想填充缺失值,而不是基于 LOCF,而是基于该组可用的值。虽然我能够根据Filling missing value in group 的回答做到这一点,但我正在寻找有关以下方面的解释:
问题 a) (Final_Rank = Final_Rank[1])。发帖人没有解释这部分。
问题 b) 还有其他更有效(在速度方面)的方法吗?我看到一个使用Data.Table,但我不太熟悉。我无法使用Data.Table 做到这一点。实际数据大小为 2GB。
这是我的数据:
dput(DF)
structure(list(SL3 = c("SE", "SE", "SE", "SE", "SE", "SE", "SW",
"SW", "SW", "SW", "SW", "SW"), SL6 = c("SL123", "SL123", "SL123",
"SL123", "SL123", "SL124", "SL123", "SL123", "SL123", "SL123",
"SL123", "SL124"), Sname = c("123 Inc", "123 Inc", "123 Inc",
"123 Inc", "123 Inc", "234 Inc", "345 Inc", "345 Inc", "345 Inc",
"345 Inc", "345 Inc", "567 Inc"), Group = c("Red", "Sapphire",
"Red", "Sapphire", "White", "Red", "Red", "Sapphire", "Red",
"Sapphire", "White", "Red"), Final_Rank = c("High", "Medium",
NA, NA, "Low", NA, "High", "Medium", NA, NA, "Low", NA), Value = c(1,
2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6)), .Names = c("SL3", "SL6", "Sname",
"Group", "Final_Rank", "Value"), row.names = c(NA, 12L), class = "data.frame")
这是我的代码:
DF%>%
dplyr::group_by(SL3,SL6, Sname, Group) %>%
dplyr::arrange(SL3,SL6, Sname, Group, Final_Rank) %>%
dplyr::mutate(Final_Rank = Final_Rank[1])
预期输出:
SL3 SL6 Sname Group Final_Rank Value
<chr> <chr> <chr> <chr> <chr> <dbl>
1 SE SL123 123 Inc Red High 1
2 SE SL123 123 Inc Red High 3
3 SE SL123 123 Inc Sapphire Medium 2
4 SE SL123 123 Inc Sapphire Medium 4
5 SE SL123 123 Inc White Low 5
6 SE SL124 234 Inc Red <NA> 6
7 SW SL123 345 Inc Red High 1
8 SW SL123 345 Inc Red High 3
9 SW SL123 345 Inc Sapphire Medium 2
10 SW SL123 345 Inc Sapphire Medium 4
11 SW SL123 345 Inc White Low 5
12 SW SL124 567 Inc Red <NA> 6
正如我们在上面看到的,因为第 12 行和第 6 行的其他地方不存在 Final_Rank,所以我会得到 NA。如果我使用tidyr::fill(),那些会被填满。
如果有人能帮助我解决上述两个问题,我将不胜感激。
【问题讨论】:
-
Final_Rank = Final_Rank[1]只是将Final_Rank替换为Final_Rank的第一个值。如果有非 NA,它将是第一个。 -
@Haboryme - 感谢您的帮助...您能解释一下“第一个”值是什么意思吗?您是指分组集中的第一个值吗?如果是这样,那么通过
Final_Rank[2],我应该得到一些数字和一些NAs,但我得到所有NAs。不知道为什么。 -
你会得到所有的 NA,因为当你订购时,NA 总是最后的(试试
x <- c(1, 2, NA, 6, 11, NA, 9); x[order(x)])。因此,如果您有 2 个值,它们是c('High', NA),那么Final_Rank[2] == NA。另一方面,如果您只有 1 个值(即c('High')),那么尝试获取第二个元素(使用Final_Rank[2])将导致 NA(因为它不存在)。 -
@Sotos 我认为其中一个有 2 个非 NA 值,我误读了。那么这是有道理的,ty。
-
我再问一遍:你目前的做法不正确怎么办?您想要改变的只是速度,还是有其他原因?