R 保持最后n列仅由分隔符分隔输出

R 保持最后n列仅由分隔符分隔输出,r,tidyverse,delimiter,R,Tidyverse,Delimiter,我有一个带有以下因子变量的数据帧: > head(example.df) path 1 C:/Users/My PC/pinkhipppos/tinyhorsefeet/location1/categoryA/eyoshdzjow_random_image.txt (编成目录) 我想根据分隔符拆分为单独的列:/ 我可以

我有一个带有以下因子变量的数据帧:

> head(example.df)
                                                                                      path
1 C:/Users/My PC/pinkhipppos/tinyhorsefeet/location1/categoryA/eyoshdzjow_random_image.txt
(编成目录)

我想根据分隔符拆分为单独的列:
/

我可以使用

library(tidyverse)

example.df <- example.df %>% 
  separate(path,
           into=c("dir",
                  "ok",
                  "hello",
                  "etc...",
                  "finally...",
                  "location",
                  "category",
                  "filename"),
           sep="/")
可复制:

example.df <- as.data.frame(
  c("C:/Users/My PC/pinkhipppos/tinyhorsefeet/location1/categoryA/eyoshdzjow_random_image.txt",
    "C:/Users/My PC/pinkhipppos/tinyhorsefeet/location2/categoryB/jdugnbtudg_random_image.txt")
)

colnames(example.df)<-"path"

example.df基址R中的一种方法是在
“/”
处拆分字符串,并从每个列表中选择最后3个元素

as.data.frame(t(sapply(strsplit(as.character(example.df$path), "/"), tail, 3)))

#         V1        V2                          V3
#1 location1 categoryA eyoshdzjow_random_image.txt
#2 location2 categoryB jdugnbtudg_random_image.txt

使用
tidyverse
,我们可以获取长格式的数据,选择每行的最后3个条目,并获取宽格式的数据

library(tidyverse)

example.df %>%
  mutate(row = row_number()) %>%
  separate_rows(path, sep = "/") %>%
  group_by(row) %>%
  slice((n() - 2) : n()) %>%
  mutate(cols = c('location', 'category', 'filename')) %>%
  pivot_wider(names_from = cols, values_from = path) %>%
  ungroup() %>%
  select(-row)

# A tibble: 2 x 3
#  location  category  filename                   
#  <chr>     <chr>     <chr>                      
#1 location1 categoryA eyoshdzjow_random_image.txt
#2 location2 categoryB jdugnbtudg_random_image.txt

杰出的我会在我能接受的时候接受。也会对tidyverse解决方案感兴趣。非常感谢。添加了一个
tidyverse
解决方案。
library(tidyverse)

example.df %>%
  mutate(row = row_number()) %>%
  separate_rows(path, sep = "/") %>%
  group_by(row) %>%
  slice((n() - 2) : n()) %>%
  mutate(cols = c('location', 'category', 'filename')) %>%
  pivot_wider(names_from = cols, values_from = path) %>%
  ungroup() %>%
  select(-row)

# A tibble: 2 x 3
#  location  category  filename                   
#  <chr>     <chr>     <chr>                      
#1 location1 categoryA eyoshdzjow_random_image.txt
#2 location2 categoryB jdugnbtudg_random_image.txt
example.df %>%
  mutate(temp = map(str_split(path, "/"), tail, 3)) %>%
  unnest_wider(temp, names_repair = ~paste0("dir", seq_along(.) - 1)) %>%
  select(-dir0)