R:转置结果表并添加列标题

时间:2016-05-26 15:03:33

标签: r rbind r-table

设置场景:

所以我有一个包含50个.csv文件的目录。

所有文件都有唯一的名称,例如1.csv 2.csv ...

每个的内容可能在行数上有所不同,但总是有4列

列标题为:

  • 日期
  • 结果1
  • 结果2
  • ID

我希望将它们全部合并到一个数据帧(mydf)中,然后我想忽略任何有NA值的行。

这样我就可以计算一个" ID"的完整实例数量。曾经有。通过调用例如;

  • myfunc(" my_files",1)
  • myfunc(" my_files",c(2,4,6))

到目前为止我的代码:

myfunc <- function(directory, id = 1:50) {
        files_list <- list.files(directory, full.names=T)
        mydf <- data.frame()
        for (i in 1:50) {
                mydf <- rbind(mydf, read.csv(files_list[i]))
        }
        mydf_subset <- mydf[which(mydf[, "ID"] %in% id),]
        mydf_subna <- na.omit(mydf_subset)
        table(mydf_subna$ID)
}

我的问题以及我需要帮助的地方:

我的结果以这种方式出现

2   4    6   
200 400  600

我希望将它们转换成这样的。我不确定调用一个表是对的还是我应该把它称为.matrix?

2 100
4 400
8 600

我还希望拥有原始文件中的标题或指定新标题

ID Count
2  100
4  400
8  600

欢迎提出任何建议

马特

其他更新

我尝试修改下面的一些有用的评论,所以我也有一组看起来像这样的代码;

myfunc <- function(directory, id = 1:50) {
        files_list <- list.files(directory, full.names=T)
        mydf <- data.frame()
        for (i in 1:50) {
                mydf <- rbind(mydf, read.csv(files_list[i]))
        }
        mydf_subset <- mydf[which(mydf[, "ID"] %in% id),]
        mydf_subna <- na.omit(mydf_subset)
        result <- data.frame(mydf_subna$ID)
        transposed_result <- t(result)
        colnames(transposed_result) <- c("ID","Count")
}

我试着用这个打电话:

myfunc("myfiles", 1)
myfunc("myfiles", c(2, 4, 6))

但我收到此错误

> myfunc("myfiles", c(2, 4, 6))
Error in `colnames<-`(`*tmp*`, value = c("ID", "Count")) : 
  length of 'dimnames' [2] not equal to array extent

我想知道是否我没有正确地创建这个data.frame并且应该使用cbind或者不按ID对行进行求和?

2 个答案:

答案 0 :(得分:0)

欢迎使用Stack Overflow。

我假设您编写的函数返回保存在变量ans中的表。

您可以尝试使用此代码:

ans <- myfunc("my_files", c(2,4,6))

ans2 <- data.frame(ans)

colnames(ans2) <- c('ID' ,'Count')

答案 1 :(得分:0)

您需要更改功能以创建数据框而不是表格,然后转置该数据框。改变行

table(mydf_subna$ID)

取而代之的是

result <- data.frame(mydf_subna$ID) 

然后使用转换数据框的t()函数

transposed_result <- t(result) 

colnames(transposed_result) <- c("ID","Count")