1

设置场景:

所以我有一个目录,里面有 50 个 .csv 文件。

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

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

列标题是:

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

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

这样我就可以计算出有多少个完整的“ID”实例。例如通过调用;

  • 我的函数(“我的文件”,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

我想把它们变成这样。我不确定调用表格是否正确,或者我应该将其称为 as.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 对行求和?

4

2 回答 2

0

欢迎来到堆栈溢出。

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

你可以试试这段代码:

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

ans2 <- data.frame(ans)

colnames(ans2) <- c('ID' ,'Count')
于 2016-05-26T15:14:18.500 回答
0

您需要更改函数以创建数据框而不是表,然后转置该数据框。换行

table(mydf_subna$ID)

取而代之的是

result <- data.frame(mydf_subna$ID) 

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

transposed_result <- t(result) 

colnames(transposed_result) <- c("ID","Count") 
于 2016-05-26T15:25:31.333 回答