【问题标题】:How to create multiple text files for each column in a dataframe and keep the first column?如何为数据框中的每一列创建多个文本文件并保留第一列?
【发布时间】:2017-03-01 21:38:14
【问题描述】:

我是新的 R 用户。

我有一个包含 503 列的 excel 文件。第一列表示组,而第二列直到最后一列是数字特征。

 Groups     length    width   ellip ... nth_trait
 AAA         2          1       7           1
 BBB         4          5       6           0
 CCC         1          6       3           5

我想在一次运行中为每个特征创建文本文件,文件名基于特征。代码如下所示:

 raw <- read_excel("raw_data.xlsx", sheet = 1)
 raw_df <- as.data.frame(raw)

 for (i in names(raw_df)) {
 raw_file <- paste(i, ".txt", sep = "")
 write.table(raw_df[[i]], raw_file, sep = "\t", quote = F, row.names = F, col.names = T, append = F)
}

输出包含 503 个文本文件。每个文件仅包含一列,对应于数据框中的每一列。

但我想要的每个文本文件的输出必须由第一列(组名)和特征组成,如下所示:

 length.txt

 Groups     length
 AAA          2
 BBB          4
 CCC          1

 width.txt

 Groups     width
 AAA          1
 BBB          5
 CCC          6

我应该如何修改代码?请帮忙。

【问题讨论】:

  • Groups 似乎不是行名,而是一个单独的列。如果这是真的,您可以将raw_df[[i]] 替换为raw_df[[c(1, i)]]。如果确实存储在行名中,则将row.names = F更改为row.names = TRUE
  • 是的,这些组在单独的列中。我已经编辑了这个问题。正如您所建议的那样,我尝试将 raw_df[[i]] 替换为 raw_df[[c(1,i)]] 但我收到此错误: .subset2(x, i, exact = exact) 中的错误:否1 级的此类索引。
  • 当我运行 iris[[c(1,i)]] where i = 5 它返回一个值,而不是一列。
  • 抱歉,打错了,raw_df[[c(1, i)]] 应该是 raw_df[c(1, i)]。另外,raw_df[, c(1, i)] 也可以。

标签: r loops


【解决方案1】:

在您的write.table 函数中,尝试使用cbind 将第一列与循环中引用的任何列连接起来:

write.table(cbind(raw_df[1], raw_df[i]), raw_file, sep = "\t", quote = F, row.names = F, col.names = T, append = F)

这应该可以,基于这个例子:

lapply(1:5, function(x){cbind(iris[1],iris[i])})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2015-08-04
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    相关资源
    最近更新 更多