基于具有多个值的其他列中的值创建新列

时间:2020-07-17 21:13:16

标签: r dataframe

我想要2列具有列info1的第一个字符串和列信息2的最后一个字符串。

这是我的数据视图:

id             info1                                 info2
1              2012/11/03 22:09:00                      2012/11/03 22:03:00, 2012/12/11 22:09:02  
2              2012/12/13 22:15:00                      2013/6/24 23:30:00
3              2013/8/25 00:38:00, 2013/5/07 01:55:00   2017/4/10 02:08:00, 2012/11/6 00:15:00

我想要:

id          info3                 info4
1          2012/11/03 22:09:00    2012/12/11 22:09:02 
2          2012/12/13 22:15:00    2013/6/24 23:30:00
3          2013/8/25 00:38:00     2012/11/6 00:15:00

有人可以帮忙吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

这是Tidyverse的一种方法:

我们可以使用正则表达式从info1中提取非逗号字符,后跟逗号,从info2中提取逗号,后跟空格。

library(dplyr)
library(stringr)
data %>% 
  mutate(info3 = str_extract(info1,"^[^,]+(?=,)"),
         info4 = str_extract(info2,"(?<=, )[^,]+$"))
  id                                                         info1                                    info2               info3               info4
1  1                      2015/10/22 00:28:00, 2015/10/23 00:09:00 2015/10/22 07:20:00, 2015/10/23 08:18:00 2015/10/22 00:28:00 2015/10/23 08:18:00
2  2 2015/10/22 00:28:00, 2015/10/24 00:01:00, 2015/10/23 00:09:00 2015/10/22 07:20:00, 2015/10/23 08:18:00 2015/10/22 00:28:00 2015/10/23 08:18:00

样本数据

data <- structure(list(id = 1L, info1 = "2015/10/22 00:28:00, 2015/10/23 00:09:00", 
    info2 = "2015/10/22 07:20:00, 2015/10/23 08:18:00"), class = "data.frame", row.names = c(NA, -1L))

答案 1 :(得分:0)

我们可以使用stri_extract_first_regex中的stri_extract_last_regexstringi

library(stringi)
library(dplyr)

df3 %>%
  mutate(info3 = stri_extract_first_regex(info1, '\\d+/\\d+/\\d+ \\d+:\\d+:\\d+'), 
         info4 = stri_extract_last_regex(info2, '\\d+/\\d+/\\d+ \\d+:\\d+:\\d+')) %>%
  select(-info1, -info2)

#  ID               info3               info4
#1  1 2015/10/22 00:28:00 2015/10/23 08:18:00
#2  2  2016/5/30 22:10:00  2016/6/02 05:45:00
#3  3                <NA>                <NA>
#4  4  2016/9/19 00:10:00  2016/9/20 08:29:30
#5  5                <NA>                <NA>