R 将'NA'展开为多行,填充分组变量
我有一个数据框,其中每个R 将'NA'展开为多行,填充分组变量,r,dplyr,R,Dplyr,我有一个数据框,其中每个SerialNo都有一个缺少值的行,有些行可能已经填充了数据。我需要将NA行扩展到两个新行,这两个新行由PartsUsed的唯一值组成 我相信通过使用dplyrcomplete或expand我走上了正确的道路,但我似乎无法获得正确的参数 下面是示例数据集(一个是我目前拥有的,另一个是目标df) begin_ex_dfcomplete来自tidyr,而不是dplyr,但这无疑是一个好的方向。它确实需要与dplyr中的filter组合以删除创建的NA行 tidyr::comp
SerialNo
都有一个缺少值的行,有些行可能已经填充了数据。我需要将NA
行扩展到两个新行,这两个新行由PartsUsed
的唯一值组成
我相信通过使用dplyr
complete
或expand
我走上了正确的道路,但我似乎无法获得正确的参数
下面是示例数据集(一个是我目前拥有的,另一个是目标df)
begin_ex_dfcomplete
来自tidyr
,而不是dplyr
,但这无疑是一个好的方向。它确实需要与dplyr
中的filter
组合以删除创建的NA行
tidyr::complete(df,SerialNo,PartsUsed,fill=list(Values=0)) %>%
dplyr::filter(!is.na(PartsUsed))
# A tibble: 12 x 3
SerialNo PartsUsed Values
<dbl> <chr> <dbl>
1 1234 A 0
2 1234 B 0
3 1357 A 11
4 1357 B 14
5 2468 A 0
6 2468 B 0
7 5678 A 10
8 5678 B 15
9 8080 A 0
10 8080 B 0
11 9012 A 0
12 9012 B 0
tidyr::complete(df,SerialNo,PartsUsed,fill=list(value=0))%>%
dplyr::过滤器(!is.na(PartsUsed))
#一个tibble:12x3
SerialNo部件使用的值
1234 A 0
2 1234 B 0
31357a 11
41357 B 14
52468A0
62468b0
75678 A 10
85678B15
98080A0
108080b0
119012 A 0
129012B0
这里有一个替代方案,它将保留重复的序列号
x <- subset(begin_ex_df, is.na(begin_ex_df$PartsUsed))
x <- expand.grid(SerialNo = x$SerialNo, PartsUsed = c("A", "B"))
x$Values <- 0
y <- subset(begin_ex_df, !is.na(begin_ex_df$PartsUsed))
new_df <- rbind(x, y)
new_df[order(new_df$SerialNo),]
# SerialNo PartsUsed Values
#1 1234 A 0
#2 1234 B 0
#3 1357 A 0
#4 1357 B 0
#5 1357 A 11
#6 1357 B 14
#7 2468 A 0
#8 2468 B 0
#9 5678 A 0
#10 5678 B 0
#11 5678 A 10
#12 5678 B 15
#13 8080 A 0
#14 8080 B 0
#15 9012 A 0
#16 9012 B 0
是的,但是我还需要扩展已完成的SerialNo
上的NA
s。例如SerialNo
5678。在最后的df中,应该有4次出现5678,因为NA
变成了“A”、“B”
x <- subset(begin_ex_df, is.na(begin_ex_df$PartsUsed))
x <- expand.grid(SerialNo = x$SerialNo, PartsUsed = c("A", "B"))
x$Values <- 0
y <- subset(begin_ex_df, !is.na(begin_ex_df$PartsUsed))
new_df <- rbind(x, y)
new_df[order(new_df$SerialNo),]
# SerialNo PartsUsed Values
#1 1234 A 0
#2 1234 B 0
#3 1357 A 0
#4 1357 B 0
#5 1357 A 11
#6 1357 B 14
#7 2468 A 0
#8 2468 B 0
#9 5678 A 0
#10 5678 B 0
#11 5678 A 10
#12 5678 B 15
#13 8080 A 0
#14 8080 B 0
#15 9012 A 0
#16 9012 B 0
library(dplyr)
library(tidyr)
begin_ex_df %>%
group_by(SerialNo, Ind = if_else(is.na(PartsUsed), "no", "yes")) %>%
complete(., SerialNo, PartsUsed = c("A", "B"), fill = list(Values = 0)) %>%
na.omit()
# Ind SerialNo PartsUsed Values
# <chr> <dbl> <chr> <dbl>
# 1 no 1234 A 0
# 2 no 1234 B 0
# 3 no 1357 A 0
# 4 no 1357 B 0
# 5 yes 1357 A 11
# 6 yes 1357 B 14
# 7 no 2468 A 0
# 8 no 2468 B 0
# 9 no 5678 A 0
#10 no 5678 B 0
#11 yes 5678 A 10
#12 yes 5678 B 15
#13 no 8080 A 0
#14 no 8080 B 0
#15 no 9012 A 0
#16 no 9012 B 0