这里有一些解决方案:
1) strsplit/unnest/summarize 这使用 dplyr 和 tidyr。首先将date 列转换为"Date" 类,然后拆分fruits 列,生成一个列,其中每个单元格都包含一个水果向量。 unnest 并找到最小值:
library(dplyr)
library(tidyr)
fruits %>%
mutate(date = as.Date(date, "%d.%m.%y"),
fruits = strsplit(as.character(fruits), ", ")) %>%
unnest %>%
group_by(fruits) %>%
summarize(date = min(date)) %>%
ungroup
给予:
# A tibble: 8 × 2
fruits date
<chr> <date>
1 apples 2016-08-12
2 bananas 2016-08-12
3 guavas 2017-04-22
4 kiwis 2016-09-12
5 mangos 2017-04-22
6 oranges 2016-08-12
7 pears 2016-08-12
8 pineapples 2017-04-22
1a) separate_rows/summarize 这个稍短的变体使用separate_rows(用一个更简单的命令替换strsplit 和unnest 行)。它需要 tidyr 0.5 或更高版本。它给出了相同的结果:
fruits %>%
mutate(date = as.Date(date, "%d.%m.%y")) %>%
separate_rows(fruits) %>%
group_by(fruits) %>%
summarize(date = min(date)) %>%
ungroup
2) strsplit/stack/aggregate 这不使用任何包。首先,我们拆分水果列并用日期命名结果列表L 的组件。然后我们堆叠列表创建一个数据框并重命名列,同时创建一个真正的"Date" 类列。最后我们aggregate 找到最小值。
L <- with(fruits, setNames(strsplit(as.character(fruits), ", "), as.Date(date,"%d.%m.%y")))
stk <- with(stack(L), data.frame(fruits = values, date = as.Date(ind)))
aggregate(date ~ fruits, stk, min)
给出这个data.frame:
fruits date
1 apples 2016-08-12
2 bananas 2016-08-12
3 guavas 2017-04-22
4 kiwis 2016-09-12
5 mangos 2017-04-22
6 oranges 2016-08-12
7 pears 2016-08-12
8 pineapples 2017-04-22