【问题标题】:`gather` can't handle rownames`gather` 不能处理行名
【发布时间】:2018-11-03 21:57:33
【问题描述】:
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 上运行它

我收到以下消息:

Error: Column 1 must be named

到目前为止,我尝试将-rownames 放在gather 的括号内,我尝试将remove_rownames %>% 放在newdf = df %>% 下方,但似乎没有任何效果。我尝试在没有第一列 [,-1] 的情况下读取 csv 或删除 R df[,1]<-NULL 中的第一列,但是由于某种原因,当我这样做时,我的代码返回了一个空表,而不是我想要的。 换句话说,我可以在 Excel 中删除行名,而且效果很好,如果我在 R 中删除它们,就会发生一些奇怪的事情。

这里是一些示例数据:https://drive.google.com/file/d/1RiMrx4wOpUdJkN4il6IopciSF6pKeNLr/view?usp=sharing

【问题讨论】:

  • 你确定你不只是想要row.names = 1 中的read.csv 吗?虽然这有点令人困惑,因为您的代码似乎引用了示例数据中没有的列名。
  • @joran 是的,我已经尝试过了。这是一个非常狡猾的错误。我的代码确实引用了不存在的列。我们定义了两个变量COL_DATESNOW_DEPTH。从技术上讲,日期列在技术上不是有效的列名,但我们正在将它们从列名移动到变量..

标签: r dplyr tidyr tidyverse


【解决方案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:mappurrr:reduce 代替 for 循环。这些函数将另一个函数作为参数。
  • readr::read_csv 通常比基本 R 等效项快 10 倍。 (更多信息:http://r4ds.had.co.nz/data-import.html)。它还可以更好地处理 CSV 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2023-01-26
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多