设置场景:
所以我有一个包含50个.csv文件的目录。
所有文件都有唯一的名称,例如1.csv 2.csv ...
每个的内容可能在行数上有所不同,但总是有4列
列标题为:
我希望将它们全部合并到一个数据帧(mydf)中,然后我想忽略任何有NA值的行。
这样我就可以计算一个" ID"的完整实例数量。曾经有。通过调用例如;
到目前为止我的代码:
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对行进行求和?
答案 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")