allcsvs = list.files(pattern = "*.csv$", recursive = TRUE)
library(tidyverse)
##LOOP to redact the snow data csvs##
for(x in 1:length(allcsvs)) {
df = read.csv(allcsvs[x], check.names = FALSE)
newdf = df %>%
gather(COL_DATE, SNOW_DEPTH, -PT_ID, -DATE) %>%
mutate(
DATE = as.Date(DATE,format = "%m/%d/%Y"),
COL_DATE = as.Date(COL_DATE, format = "%Y.%m.%d")
) %>%
filter(DATE == COL_DATE) %>%
select(-COL_DATE)
####TURN DATES UNAMBIGUOUS HERE####
df$DATE = lubridate::mdy(df$DATE)
finaldf = merge(newdf, df, all.y = TRUE)
write.csv(finaldf, allcsvs[x])
df = read.csv(allcsvs[x])
newdf = df[, -grep("X20", colnames(df))]
write.csv(newdf, allcsvs[x])
}
我使用上面的代码使用来自不同现有列的值逐行填充新列,使用日期作为选择条件。如果我手动打开excel中的每个.csv并删除第一列,这段代码效果很好。但是,如果我在.csvs&#34上运行它,那就是"
我收到以下消息:
Error: Column 1 must be named
到目前为止,我已尝试将-rownames
放在gather
的括号内,我已尝试将remove_rownames %>%
置于newdf = df %>%
之下,但似乎没有工作。我尝试在没有第一列[,-1]
的情况下读取csv或删除R df[,1]<-NULL
中的第一列但由于某种原因,当我这样做时,我的代码返回一个空表而不是我想要它。 换句话说,我可以删除Excel中的rownames并且效果很好,如果我在R中删除它们会发生一些时髦的事情。
以下是一些示例数据:https://drive.google.com/file/d/1RiMrx4wOpUdJkN4il6IopciSF6pKeNLr/view?usp=sharing
答案 0 :(得分:1)
您可以考虑使用readr::read_csv
导入它们。
使用tidyverse
的简单解决方案:
allcsvs %>%
map(read_csv) %>%
reduce(bind_rows) %>%
gather(COL_DATE, SNOW_DEPTH, -PT_ID, -DATE) %>%
mutate(
DATE = as.Date(DATE,format = "%m/%d/%Y"),
COL_DATE = as.Date(COL_DATE, format = "%Y.%m.%d")
) %>%
filter(DATE == COL_DATE) %>%
select(-COL_DATE)
使用utils::read.csv
,您导入的字符串是因子。 as.Date(DATE,format = "%m/%d/%Y")
评估NA
。
更新
上述解决方案返回一个数据帧。使用for循环分别编写每个数据文件:
for(x in 1:length(allcsvs)) {
read_csv(allcsvs[x]) %>%
gather(COL_DATE, SNOW_DEPTH, -PT_ID, -DATE) %>%
mutate(
COL_DATE = as.Date(COL_DATE, format = "%Y.%m.%d")
) %>%
filter(DATE == COL_DATE) %>%
select(-COL_DATE) %>%
write_csv(paste('tidy', allcsvs[x], sep = '_'))
}
比较
purrr:map
和purrr:reduce
代替for循环。这些函数将另一个函数作为参数。readr::read_csv
通常比基本R等价物快10倍。 (更多信息:http://r4ds.had.co.nz/data-import.html)。它还可以更好地处理CSV文件。