迭代R数据帧中的列名以更改其类型

迭代R数据帧中的列名以更改其类型,r,R,但它会抛出 f <- function(x) {x <- mdy(x)} newdf <- apply(df,2,f) 新的DF很糟糕: Warning messages: 1: All formats failed to parse. No formats found. ... 10: All formats failed to parse. No formats found. 我在做什么,这就是st00pid 所以,一旦完成,我们想做一些约会数学 Col.

但它会抛出

f <- function(x) {x <- mdy(x)}
newdf <- apply(df,2,f)
新的DF很糟糕:

Warning messages:
1: All formats failed to parse. No formats found. 
...
10: All formats failed to parse. No formats found. 
我在做什么,这就是st00pid

所以,一旦完成,我们想做一些约会数学

     Col.a Col.b Col.c Project1.start Project1.end Project2.start Project2.end Col.f
[1,]    NA    NA    NA             NA           NA             NA           NA    NA
[2,]    NA    NA    NA             NA           NA             NA           NA    NA
[3,]    NA    NA    NA             NA           NA             NA           NA    NA

       Project1.duration Project2.duration
[1,]                NA                NA
[2,]                NA                NA
[3,]                NA                NA

df$Project1.duration您的错误是因为您的
apply
mdy
应用于
df
的每一列,而不仅仅是“ProjectX.{start,end}”列。另外,因为
df[col]
是一个
数据帧
,而
mdy
需要一个向量——请尝试
df[[col]]

e、 g

(可能带有某种ID变量,这样您就可以知道哪个项目2与哪个项目1对应)


然后您可以轻松地执行
mydf$duration您的错误是因为您的
apply
mdy
应用于
df
的每一列,而不仅仅是“ProjectX.{start,end}”列。另外,因为
df[col]
是一个
数据帧
,而
mdy
需要一个向量——请尝试
df[[col]]

e、 g

(可能带有某种ID变量,这样您就可以知道哪个项目2与哪个项目1对应)


然后,您可以轻松地执行类似这样的
mydf$duration:
for(col in 1:10)df[col]是的,这就是我一直在尝试的,即使使用
seq()
使它变得漂亮。但它抛出3:All格式无法解析。找不到任何格式。我在newdf中使用for(col in 4:7){newdf[col]不使用
apply
,它将对象转换为一个不处理混合类型的矩阵,方法如下:
for(col in 1:10)df[col]是的,这就是我尝试的,即使使用
seq()
使其美观。但它抛出3:All格式无法解析。找不到任何格式。并且我在newdf中使用for(col in 4:7)得到了NA{newdf[col]不使用
apply
,它将对象转换为不处理混合类型的矩阵
     Col.a Col.b Col.c Project1.start Project1.end Project2.start Project2.end Col.f
[1,]    NA    NA    NA             NA           NA             NA           NA    NA
[2,]    NA    NA    NA             NA           NA             NA           NA    NA
[3,]    NA    NA    NA             NA           NA             NA           NA    NA

       Project1.duration Project2.duration
[1,]                NA                NA
[2,]                NA                NA
[3,]                NA                NA
df$Project1.duration <- (df$Project1.end - df$Project1.start )
df$Project2.duration <- (df$Project2.end - df$Project2.start )
cols <- grep('Project', names(df))
# do a one-liner like this
df[cols] <- lapply(df[cols], mdy)
# or a loop like this if you want
for (col in cols) {
    df[[col]] <- mdy(df[[col]])
}
projects <- paste0('Project', 1:2) # however many projects
df[paste0(projects, '.duration')] <- df[paste0(projects, '.end')] - df[paste0(projects, '.start')]
Project  start  end duration
 1       ...
 1
 1
 2
 2
 2