【问题标题】:read csv five with array cols in R在R中读取带有数组列的csv文件
【发布时间】:2021-03-16 08:49:29
【问题描述】:

我的 CSV 文件是这样的

col3 和 col4 的长度总是相同的;

col1,col2,col3,col4
1,2,"[1,2,3]","[1.2,2.3,2.1]"
1,3,"[1,2]","[2.5,2.6]"
2,1,"[1,2,3,4]","[1,2,3,4,5]"
3,1,"[10]","[-0.2]"

这是我的数据结构

structure(list(col1 = c(1L, 1L, 2L, 3L), col2 = c(2L, 3L, 1L, 
1L), col3 = c("[1,2,3]", "[1,2]", "[1,2,3,4]", "[10]"), col4 = c("[1.2,2.3,2.1]", 
"[2.5,2.6]", "[1,2,3,4,5]", "[-0.2]")), row.names = c(NA, -4L
), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x323ce50>)


我需要像这样取消嵌套后的数据

col1,col2,col3,col4
1,2,1,1.2
1,2,2,2.3
1,2,3,2.1
1,3,1,2.5
1,3,2,2.6
....

我应该如何处理这些数据?

【问题讨论】:

  • 在 data.table 的 fread 函数中可以快速读取此类数据而无需额外的后处理,对于该 FR 的状态,请在此处查看/upvote github.com/Rdatatable/data.table/issues/1162
  • 值得注意的是,data.table的fwrite中已经可以写入这类数据了

标签: r dataframe data.table tidyr


【解决方案1】:

从数据中删除 [] 并在 col3col4 上使用 separate_rows 以获取长格式。

library(dplyr)
library(tidyr)

df %>%
  mutate(across(c(col3,col4), ~gsub('\\[|\\]', '', .))) %>%
  #mutate_at(vars(c(col3,col4)), ~gsub('\\[|\\]', '', .))
  separate_rows(col3, col4, convert = TRUE, sep = ',')

#  col1  col2  col3  col4
#  <int> <int> <int> <dbl>
#1     1     2     1   1.2
#2     1     2     2   2.3
#3     1     2     3   2.1
#4     1     3     1   2.5
#5     1     3     2   2.6
#6     2     1     1   1  
#7     2     1     2   2  
#8     2     1     3   3  
#9     2     1     4   4  

数据

df <- structure(list(col1 = c(1L, 1L, 2L), col2 = c(2L, 3L, 1L), 
      col3 = c("[1,2,3]", "[1,2]", "[1,2,3,4]"), col4 = c("[1.2,2.3,2.1]",
      "[2.5,2.6]", "[1,2,3,4]")), class = "data.frame", row.names = c(NA, -3L))

【讨论】:

  • 非常感谢,但是我在本地库中找不到across,我的开发环境处于离线状态,我使用的是简单代码
  • acrossdplyr 1.0.0 或更高版本中可用。如果您有旧版本使用mutate_at,请将第二行替换为mutate_at(vars(c(col3,col4)), ~gsub('\\[|\\]', '', .))。保持separate_rows 行不变。
  • 我有一个 col3 或 col4 只有一个元素,所以进度报告所有嵌套列必须相同长度
  • 对不起,我不明白。你的意思是?您能否使用dput 提供一个可重现的示例,以便清楚您的数据是如何格式化的。
  • 我更新问题,你的答案无法处理我第四行的新数据框
猜你喜欢
  • 1970-01-01
  • 2018-05-27
  • 2013-09-26
  • 2020-09-22
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 2022-01-16
相关资源
最近更新 更多