【问题标题】:Replace integer(0) in the cells of a dataframe containing lists替换包含列表的数据框单元格中的 integer(0)
【发布时间】:2018-05-14 12:26:03
【问题描述】:

我需要从 R 中以 CSV 格式导出数据框,其中一些单元格具有整数 (0) 值,而其他单元格是列表(使用 df$B[k]=list(vector) 存储在数据框中)

A              B                  C
Comp1          integer(0)         c(17, 15)
Comp2          integer(0)         integer(0)                                
Comp3          c(15, 14)          integer(0)  
Comp4          15                 c(12, 13, 14)
Comp5          c(16, 13, 12)      integer(0)

当使用fwrite(df, "data.csv") 以 CSV 格式导出时,如果 列 n 的单元格的值,列 n 的值将转移到 列 n-1 -1 是整数(0)。

我试过了:

df$B <- as.character(df$B)
df$B[df$B == "integer(0)"] <- "."

但由于某些单元格包含列表,我不能使用 as.character 并用其他东西替换“integer(0)”,因为它会与某些单元格混淆(列表是带有 ',' 的向量,其中将被解释为选项卡当使用as.character 转换并导出为 CSV 时)。

有什么办法可以解决这个问题?

【问题讨论】:

标签: r list csv dataframe


【解决方案1】:

如果您向我们提供来自dput(df) 的代码,就像在关于可重现示例的问题中所建议的那样,那就太好了。 无论如何,这就是我生成df的方式:

df <- data.frame(A = c("Comp1", "Comp2", "Comp3", "Comp4", "Comp5"))
for(k in 1:5){
  donors <- 16:12
  pick <- list(k1 = 0, k2 = 0, k3 = c(2, 3), k4 = 2, k5 = c(1, 4, 5))
  vector <- donors[pick[[k]]]
  df$B[k] <- list(vector)
}

我首先想到的是:真的有必要将列表保存在 data.frame 中吗?第二件事:大概vector 在你的例子中是一个向量。但是vector 是在R 中实现的函数的名称(参见?vector),所以我会给你的向量一个不同的名称(例如vec)。 对于你的问题:我不会跑

df$B <- as.character(df$B)
df$B[df$B == "integer(0)"] <- "."

但是

df$B[sapply(df$B, length) == 0] <- NA
fwrite(df, "data.csv", na = ".")

【讨论】:

  • 这样完美解决问题,非常感谢;我不知道保存选项na='.'。此外,我会确保下次改进对我的问题的描述。非常感谢!
  • 您仍然可以更新您的问题。如果您认为我的回答有用,除了接受之外,您还可以点赞。
猜你喜欢
  • 2020-08-29
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 2021-06-01
  • 2023-03-10
相关资源
最近更新 更多