LIFO在将逗号分隔的行值转换为单独的行值中的实现

时间:2018-06-29 06:43:25

标签: r

我有一个data frame,其中各个行值用逗号分隔,我想将逗号值分隔成各个行值。因此,使用this SO post能够在各个行中转换以逗号分隔的字符串值,但是,如果该行与我想对此取反,它将字符串的第一个值替换为第一个值,即First string value is the last row value

# create data 
library(tidyverse)
d <- data_frame(
  col1 = c("1,2,3")
)

Dataframe

    # # A tibble: 3 x 2
#              col1
#              <chr>
# 1            1,2,3


# tidy data
separate_rows(d, col1, convert = TRUE)

Current Output

# # A tibble: 6 x 2
#     col1
#    <int>
#      1
#      2
#      3

Desired Output

# tidy data
separate_rows(d, col1, convert = TRUE)
# # A tibble: 6 x 2
#     col1
#    <int>
#      3
#      2
#      1

3 个答案:

答案 0 :(得分:4)

用逗号分隔列,反转向量,构造一个数据框。

样本数据:

> d = data.frame(col1=c("23,34,99","9,3,2"),stringsAsFactors=FALSE)
> d
      col1
1 23,34,99
2    9,3,2

要做:

> data.frame(col1=do.call(c,lapply(strsplit(d$col1,","),rev)))
  col1
1   99
2   34
3   23
4    2
5    3
6    9

答案 1 :(得分:2)

我们可以使用slice

反转数据框并以相反的顺序选择索引
library(tidyverse)
separate_rows(d, col1, convert = TRUE) %>%
   slice(n():1)

#   col1
#   <int>
#1     3
#2     2
#3     1

对于多行,以@Spacedman为例

d = data.frame(col1=c("23,34,99","9,3,2"),stringsAsFactors=FALSE)

上述解决方案会给出

separate_rows(d, col1, convert = TRUE) %>%
     slice(n():1)
# A tibble: 6 x 1
     col1
    <int>
#1     2
#2     3
#3     9
#4    99
#5    34
#6    23

但是,如果OP需要分别反转每一行的字符串,我们可以使用group创建一个row_number列,然后按照@Sotos的建议分别反转每一行的字符串

d %>%
  mutate(group = row_number()) %>%
  separate_rows(col1, convert = TRUE) %>%
  group_by(group) %>%
  slice(n():1) %>%
  ungroup() %>%
  select(-group)


# A tibble: 6 x 1
#   col1
#  <int>
#1    99
#2    34
#3    23
#4     2
#5     3
#6     9

答案 2 :(得分:0)

您可以使用stri_reverse包中的stringi并在分离之前反转字符串,即

library(tidyverse)

d %>% 
 mutate(col1 = stringi::stri_reverse(col1)) %>% 
 separate_rows(col1)

给出

A tibble: 3 x 1
  col1 
  <chr>
1 3    
2 2    
3 1