在 R 中给定不同条件拼接行值

4

我正在尝试在R中按不同条件连接特定行值(字符串)。 我已在Flag中标记了行值(在此示例中,标记标准无关紧要)。

符号说明:B为运行的开始,E为结束。 0表示在运行范围之外。 1表示运行中除BE之外的任何字符串。你的解决方案不需要遵循我的约定。

规则:每个运行必须以B开头并以E结尾。运行中可以有任意数量的1 。在BE(两者都包括在内)之间定位的任何字符串都将按其在运行中的位置顺序连接,并替换B -string。. 0-string将保留在数据框中。连接后1E 字符串将被删除。

我还没有想到与期望输出接近的任何东西。

set.seed(128)
df2 <- data.frame(Strings = sample(letters, 17, replace = T), 
                  Flag = c(0,"B",1,1,"E","B","E","B","E",0,"B",1,1,1,"E",0,0))

   Strings Flag
1        d    0
2        r    B
3        q    1
4        r    1
5        v    E
6        f    B
7        y    E
8        u    B
9        c    E
10       x    0
11       h    B
12       w    1
13       x    1
14       t    1
15       j    E
16       d    0
17       j    0

中间输出。

   Strings Flag    Result
1        d    0         d
2        r    B   r q r v
3        q    1         q
4        r    1         r
5        v    E         v
6        f    B       f y
7        y    E         y
8        u    B       u c
9        c    E         c
10       x    0         x
11       h    B h w x t j
12       w    1         w
13       x    1         x
14       t    1         t
15       j    E         j
16       d    0         d
17       j    0         j

期望的产出。

     Result
1         d
2   r q r v
3       f y
4       u c
5         x
6 h w x t j
7         d
8         j
2个回答

1

这里有一个可能会帮助你的解决方案。不过,我还不确定我是否正确理解了你的意思:

library(dplyr)

df2 %>%
  mutate(Flag2 = cumsum(Flag == 'B' | Flag == '0')) %>%
  group_by(Flag2) %>%
  summarise(Result = paste0(Strings, collapse = ' '))


# A tibble: 8 × 2
  Flag2 Result   
  <int> <chr>    
1     1 d        
2     2 r q r v  
3     3 f y      
4     4 u c      
5     5 x        
6     6 h w x t j
7     7 d        
8     8 j  

1

使用 dplyr

library(dplyr)

set.seed(128)
df2 <- data.frame(Strings = sample(letters, 17, replace = T), 
                  Flag = c(0,"B",1,1,"E","B","E","B","E",0,"B",1,1,1,"E",0,0))

df2 %>% 
  group_by(group = cumsum( (Flag=="B") + (lag(Flag,1,"0")=="E"))) %>% 
  mutate(Result=if_else(Flag=="B", paste0(Strings,collapse = " "),Strings)) %>% 
  filter(!(Flag %in% c("1", "E"))) %>% ungroup() %>% 
  select(-group, -Strings, -Flag)

#> # A tibble: 8 × 1
#>   Result   
#>   <chr>    
#> 1 d        
#> 2 r q r v  
#> 3 f y      
#> 4 u c      
#> 5 x        
#> 6 h w x t j
#> 7 d        
#> 8 j

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接