Dataframe R中拆分列

cclgggtu  于 2023-04-18  发布在  其他
关注(0)|答案(3)|浏览(132)

我有一个 Dataframe ,看起来像这样:
| 种|时间|洛克|
| --------------|--------------|--------------|
| 芭芭芭芭|九点半|1个|
| 巴尔巴尔|十点三十七分|四|
| 巴巴,皮皮|十二点零三分|二|
| 芭芭,皮皮,海普萨|九点五十二分|五|
| 皮皮普|七点四十五分|五|
| 巴巴,皮皮|零点|三|
基本上,我会创建新的行来分割物种列时,有两个标签在同一情况下。
例如:如果我有这样一行:
| 种|时间|洛克|
| --------------|--------------|--------------|
| 芭芭,皮皮,海普萨|九点五十二分|五|
我将获得以下行:
| 种|时间|洛克|
| --------------|--------------|--------------|
| 巴尔巴尔|九点五十二分|五|
| 皮皮|九点五十二分|五|
| 许普萨夫|九点五十二分|五|
因此,对于第一个 Dataframe ,我会得到这样的结果:
| 种|时间|洛克|
| --------------|--------------|--------------|
| 巴尔巴尔|九点半|1个|
| 巴尔巴尔|九点半|1个|
| 巴尔巴尔|十点三十七分|四|
| 巴尔巴尔|十二点零三分|二|
| 皮皮|十二点零三分|二|
| 巴尔巴尔|九点五十二分|五|
| 皮皮|九点五十二分|五|
| 许普萨夫|九点五十二分|五|
| 皮皮|七点四十五分|五|
| 巴尔巴尔|七点四十五分|五|
| 巴尔巴尔|零点|三|
| 皮皮|零点|三|
我该怎么做才能得到结果?

9fkzdhlc

9fkzdhlc1#

关于unnest

library(dplyr)
library(tidyr)

df %>% 
  mutate(species = strsplit(species, ",")) %>% 
  unnest(species)
# A tibble: 12 × 3
   species time    loc
   <chr>   <chr> <int>
 1 Barbar  9:30      1
 2 Barbar  9:30      1
 3 Barbar  10:37     4
 4 Barbar  12:03     2
 5 Pippip  12:03     2
 6 Barbar  09:52     5
 7 Pippip  09:52     5
 8 Hypsav  09:52     5
 9 Pippip  07:45     5
10 Barbar  07:45     5
11 Barbar  00:00     3
12 Pippip  00:00     3
数据
df <- structure(list(species = c("Barbar,Barbar", "Barbar", "Barbar,Pippip", 
"Barbar,Pippip,Hypsav", "Pippip,Barbar", "Barbar,Pippip"), time = c("9:30", 
"10:37", "12:03", "09:52", "07:45", "00:00"), loc = c(1L, 4L, 
2L, 5L, 5L, 3L)), class = "data.frame", row.names = c(NA, -6L))
xghobddn

xghobddn2#

尝试使用以下语句,使用,作为当前分隔符

library(tidyverse)

data_split <- data %>%
  separate(species, into = c("species1", "species2", "species3"), sep = ",") %>%
  pivot_longer(cols = starts_with("species"), values_to = "species") %>%
  filter(!is.na(species)) %>%
  select(-name)
  print(data_split)
bwleehnv

bwleehnv3#

或者,可以使用data.table方法:

library(data.table)

# convert df to a data.table
setDT(df)

# at first split the species and reassign it to the same column
# then unlist to distribute the species for every "loc" and "time"
df[,species:=strsplit(x = species, split = ","),][
  ,.(species = unlist(species)), by=.(loc,time)]

#    loc  time species
# 1:   1  9:30  Barbar
# 2:   1  9:30  Barbar
# 3:   4 10:37  Barbar
# 4:   2 12:03  Barbar
# 5:   2 12:03  Pippip
# 6:   5 09:52  Barbar
# 7:   5 09:52  Pippip
# 8:   5 09:52  Hypsav
# 9:   5 07:45  Pippip
#10:   5 07:45  Barbar
#11:   3 00:00  Barbar
#12:   3 00:00  Pippip

根据您的一般工作流程或数据大小,您可以评估最适合您的工作。

相关问题