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

R 基于具有多个值的其他列中的值创建新列,r,dataframe,R,Dataframe,我想要两个列,其中第一个字符串为列info1,最后一个字符串为列info2 以下是我的数据视图: 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

我想要两个列,其中第一个字符串为列info1,最后一个字符串为列info2

以下是我的数据视图:

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
有人能帮忙吗


谢谢

这里有一个来自Tidyverse的方法:

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

样本数据

我们可以从stringi中使用stri_extract_first_正则表达式和stri_extract_last_正则表达式


您可以使用df1%>%mutateInfo=Map2Info 1,info2,~cfirst.x,last.y或在基本R中,df1$info3原始数据是否包含*?最好澄清列是列表还是字符串谢谢,Akrun。请允许我澄清。首先,我意识到我实际上需要两列,一列具有第一列的第一个值,另一列具有第二列的最后一个值。这些值实际上是字符。我加了一个a来说明这一点。不,*不在数据中,我用它来强调我在寻找什么。嗨,伊恩。谢谢你的回复。我意识到我的数据描述不准确,实际上我需要两列,一列是第一列的第一个值,另一列是第二列的最后一个值。我的数据不是数字而是字符。伊恩,再次为不清楚道歉。我试图创建一个非常简单的示例,最初只使用数字,但我意识到这不是最好的方法,因为生成的代码实际上取决于数据。所以,我实际上是在处理上面所示的数据。有没有办法修改您的代码以使其正常工作?再次,我为我的不清楚表示歉意,任何帮助都将不胜感激。谢谢你,伊恩!当每列中有2个字符串时,它确实起作用。如果有三个或更多字符串,如第2列所示,我将如何修改代码?谢谢你,Ronak!!!这对我来说并不完全有效;然而,您的代码确实激励我使用粘贴。这就是我所做的。rest_interval_exclusion$try%extractcinfo3,info4,regex='.*?,.*.'。不过我收到了一条关于摘录的错误消息。我有没有做过什么明目张胆的事?提前谢谢你@福勒你能用dputheaddata添加你的数据吗?我刚刚在上面添加了它。有很多日期和时间,所以我不确定数据的可解释性。如果不清楚请告诉我…谢谢!!!不,您使用的语法是错误的。你为什么不在我的回答中使用unite?当每列中只有一个字符串时(如ID2中),IIt不起作用。只有空白。
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))
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>