1

试图将两列数据传播到会有一些 NA 值的格式。

数据框:

df <- data.frame(Names = c("TXT","LSL","TXT","TXT","TXT","USL","LSL"), Values = c("apple",-2,"orange","banana","pear",10,-1),stringsAsFactors = F)

在此处输入图像描述

如果一行包含TXT以下已属于LSLUSL将属于该行的行。

例如:

  • 在第一行;名称是TXT值是apple下一行是LSL值将是苹果的LSL,因为直到下一个名称USL才会出现。NATXT

  • 如果有 aTXT后跟 another TXT,则该行的LSLandUSL值将是NA

试图创造这个:

在此处输入图像描述

我尝试使用带有行号的传播作为唯一标识符,但这不是我想要的:

df %>% group_by(Names) %>% mutate(row = row_number()) %>% spread(key = Names,value = Values)

我想我需要创建以下带有 NA 的完整表,然后传播但无法弄清楚如何。

在此处输入图像描述

4

2 回答 2

1

complete我们可以根据“TXT”的出现创建分组索引后扩展数据集

library(dplyr)
library(tidyr)
df %>% 
     group_by(grp = cumsum(Names == 'TXT')) %>%
     complete(Names = unique(.$Names)) %>%
     ungroup %>% 
     spread(Names, Values) %>%
     select(TXT, LSL, USL)
# A tibble: 4 x 3
#  TXT    LSL   USL  
#  <chr>  <chr> <chr>
#1 apple  -2    <NA> 
#2 orange <NA>  <NA> 
#3 banana <NA>  <NA> 
#4 pear   -1    10   
于 2020-03-26T22:59:30.270 回答
0

data.table中,我们可以使用dcast

library(data.table)

dcast(setDT(df), cumsum(Names == 'TXT')~Names, value.var = 'Values')[, -1]

#    LSL    TXT  USL
#1:   -2  apple <NA>
#2: <NA> orange <NA>
#3: <NA> banana <NA>
#4:   -1   pear   10
于 2020-03-27T06:16:51.773 回答