R 将多个字符列更改为最新

R 将多个字符列更改为最新,r,tidyverse,lubridate,R,Tidyverse,Lubridate,我有20个左右的多个字符列,我想把它们全部改为日期格式,并用r删除时间。我尝试过循环、变异和应用 下面是一些仅使用两列的示例数据 col1 = c("2017-04-01 23:00:00", "2017-03-03 00:00:01", "2017-04-02 00:00:01") col2 = c("2017-04-10 08:41:49", "2017-04-10 08:39:48", "2017-04-10 08:41:51") df <- cbind(col1, col2)

我有20个左右的多个字符列,我想把它们全部改为日期格式,并用r删除时间。我尝试过循环、变异和应用

下面是一些仅使用两列的示例数据

col1 = c("2017-04-01 23:00:00", "2017-03-03 00:00:01", "2017-04-02 
00:00:01")
col2 = c("2017-04-10 08:41:49", "2017-04-10 08:39:48", "2017-04-10 
08:41:51")
df <- cbind(col1, col2)
那也没用

我试着使用来自的答案,但也不起作用。波斯特希望转换某些变量。我希望转换所有变量,使var命令不适用


有什么有效的建议吗?谢谢。

如果你要申请所有栏目,你可以用Lappy做一个很短的电话。我将使用data.table将其传递到这里:

注意:您的测试数据实际上会生成一个矩阵,因此您需要首先将其转换为data.frame或直接转换为data.table

您可以只使用base R做同样的事情,但我个人更喜欢上面的解决方案:

df <- as.data.frame( lapply( df, as.Date ) )

> df
        col1       col2
1 2017-04-01 2017-04-10
2 2017-03-03 2017-04-10
3 2017-04-02 2017-04-10

如果您要对所有列进行应用,可以使用Lappy进行一个非常短的调用。我将使用data.table将其传递到这里:

注意:您的测试数据实际上会生成一个矩阵,因此您需要首先将其转换为data.frame或直接转换为data.table

您可以只使用base R做同样的事情,但我个人更喜欢上面的解决方案:

df <- as.data.frame( lapply( df, as.Date ) )

> df
        col1       col2
1 2017-04-01 2017-04-10
2 2017-03-03 2017-04-10
3 2017-04-02 2017-04-10

编辑:这次使用as.Date函数的正确通配符。我还添加了一个可复制的示例:

library(dplyr)

df <- data.frame(date_1 = c("2019-01-01", "2019-01-02", "2019-01-03"),
                 date_2 = c("2019-01-04", "2019-01-05", "2019-01-06"),
                 value = c(1,2,3),
                 stringsAsFactors = F)

str(df)

date_cols <- c("date_1", "date_2")

df_2 <- df %>%
   mutate_at(vars(date_cols), funs(as.Date(., "%Y-%m-%d")))

str(df_2)

编辑:这次使用as.Date函数的正确通配符。我还添加了一个可复制的示例:

library(dplyr)

df <- data.frame(date_1 = c("2019-01-01", "2019-01-02", "2019-01-03"),
                 date_2 = c("2019-01-04", "2019-01-05", "2019-01-06"),
                 value = c(1,2,3),
                 stringsAsFactors = F)

str(df)

date_cols <- c("date_1", "date_2")

df_2 <- df %>%
   mutate_at(vars(date_cols), funs(as.Date(., "%Y-%m-%d")))

str(df_2)


选中mutate_all或mutate_at。从dupped链接,将mutate_at更改为mutate_all@Sotos. 它不会像我的问题所规定的那样减少时间。这与你的问题无关!尝试data.framedf%>%mutate\u allfunsas。Date@Sotos. 我不是想让你情绪化。我想我是清楚的。将字符串转换为日期并删除时间。在原始问题的前两行说。谢谢你的密码。R状态求值错误:字符串不是标准的明确格式。请选中mutate_all或mutate_at。因此,从dupped link,将mutate_at更改为mutate_all@Sotos. 它不会像我的问题所规定的那样减少时间。这与你的问题无关!尝试data.framedf%>%mutate\u allfunsas。Date@Sotos. 我不是想让你情绪化。我想我是清楚的。将字符串转换为日期并删除时间。在原始问题的前两行说。谢谢你的密码。R状态求值错误:字符串不是标准的明确格式。谢谢@rosscova。当我在实际数据(即数据帧)上使用它时,会得到一个错误,该错误表示错误:不支持的索引类型:列表数据帧中是否有列表列?检查sapplydf,class的输出,它应该告诉您所有列的类。谢谢@rosscova。他们都是角色。不过,我找到了一种使用Alteryx将所有列重新分类为日期格式的方法。谢谢你的回复。不客气@Jordan。如果你的问题的解决方案没有显示在这里,你应该把它作为一个答案贴出来,即:回答你自己的问题,这样别人也能找到它。但我在Alteryx软件套件中使用了工作流。我不认为我可以附加工作流和it。如果可以,数据太大,无法附加。你建议我回答问题并描述工作流程吗?谢谢@rosscova。当我在实际数据(即数据帧)上使用它时,会得到一个错误,该错误表示错误:不支持的索引类型:列表数据帧中是否有列表列?检查sapplydf,class的输出,它应该告诉您所有列的类。谢谢@rosscova。他们都是角色。不过,我找到了一种使用Alteryx将所有列重新分类为日期格式的方法。谢谢你的回复。不客气@Jordan。如果你的问题的解决方案没有显示在这里,你应该把它作为一个答案贴出来,即:回答你自己的问题,这样别人也能找到它。但我在Alteryx软件套件中使用了工作流。我不认为我可以附加工作流和it。如果可以,数据太大,无法附加。你建议我回答这个问题并描述一下工作流程吗?嘿~你确定你的代码在你的计算机中有效吗?你的代码有很多NA。我的错误@DarrenTsai,我没有正确指定as.Date函数%Y-%m-%d的通配符。当前的答案应该是可行的:似乎funs是不推荐使用的软件,但您可以使用mutate_atvarsdate_cols,list~as.Date.,%Y-%m-%d代替。嘿~您确定您的代码在您的计算机中工作吗?你的代码有很多NA。我的错误@DarrenTsai,我没有正确指定as.Date函数%Y-%m-%d的通配符。当前的答案应该有效:似乎funs是不推荐的,但您可以使用mutate_atvarsdate_cols,list~as.Date.,%Y-%m-%d代替
> df
         col1       col2
1: 2017-04-01 2017-04-10
2: 2017-03-03 2017-04-10
3: 2017-04-02 2017-04-10
df <- as.data.frame( lapply( df, as.Date ) )

> df
        col1       col2
1 2017-04-01 2017-04-10
2 2017-03-03 2017-04-10
3 2017-04-02 2017-04-10
library(dplyr)

df <- data.frame(date_1 = c("2019-01-01", "2019-01-02", "2019-01-03"),
                 date_2 = c("2019-01-04", "2019-01-05", "2019-01-06"),
                 value = c(1,2,3),
                 stringsAsFactors = F)

str(df)

date_cols <- c("date_1", "date_2")

df_2 <- df %>%
   mutate_at(vars(date_cols), funs(as.Date(., "%Y-%m-%d")))

str(df_2)