我不得不承认我对这一点感到非常难过,所以对此没有明确的尝试道歉,但希望我可以清楚地提出这个问题:
我有一个数据框列表。对于所有这些,有多个日期类型变量需要格式化为日期(例如,as.Date(data $ var,format =“%m /%d /%y”))。
问题是日期变量在每个数据框中的名称都不同。在下面的示例中,我们有“start_date”和“end_date”。
有没有办法编写一些对数据框中的变量名进行操作的函数,如果找到包含“date”的文本,是否会进行格式化操作?
数据框:
west <- data.frame(
spend = sample(50:100,50,replace=T),
trials = sample(100:200,50,replace=T),
start_date = sample(c("06/07/14","06/08/14","06/09/14"), 50, replace=T),
country = sample(c("usa","canada","uk"),50,replace = T)
)
east <- data.frame(
end_date = sample(c("06/07/14","06/08/14","06/09/14"), 50, replace=T),
spend = sample(50:100,50,replace=T),
trials = sample(100:200,50,replace=T),
country = sample(c("china","japan","skorea"),50,replace = T)
)
将它们变成一个列表(实际上,这是一个更大的列表):
combined <- c(west,east)
我如何从grepl语句中获取逻辑向量并告诉它对列表元素中逻辑向量为“TRUE”的变量进行操作?
grepl("date", names(combined))
[1] FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE
答案 0 :(得分:2)
尝试
lst1 <- lapply(list(west, east), function(x) {
indx <- grepl("date", names(x))
x[,indx] <- as.Date(x[,indx], format="%m/%d/%y")
x
})
如果您需要更新单个对象,即。 east
,west
等(这是不需要的,因为大多数操作,包括使用write.csv/write.table
将其保存到文件中都可以使用lapply
在列表中完成)
list2env(setNames(lst1, c("west", "east")), envir=.GlobalEnv)
如果有多个变量date
east <- data.frame( end_date = sample(c("06/07/14","06/08/14","06/09/14"), 50,
replace=T), new_date = sample(c("06/07/14","06/12/14","06/09/14"), 50,
replace=T), spend = sample(50:100,50,replace=T), trials =
sample(100:200,50,replace=T), country =
sample(c("china","japan","skorea"),50,replace = T))
lst2 <- lapply(list(west, east), function(x) {
indx <- grepl("date", names(x))
x[,indx] <- lapply(x[,indx,drop=FALSE], as.Date, format="%m/%d/%y")
x})
lapply(lst2, head,2)
#[[1]]
# spend trials start_date country
#1 83 188 2014-06-09 usa
#2 83 107 2014-06-08 usa
#[[2]]
# end_date new_date spend trials country
#1 2014-06-08 2014-06-12 53 144 china
#2 2014-06-08 2014-06-09 100 118 china