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_df
complete
来自
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