我是R的新用户。我需要你的建议 - 我有大约100个csv文件。列数可以在每个文件中更改。我正在寻找帮助,以确定"唯一列的数量"在每个文件中 - (如果文件有重复的列,我希望它计为1个唯一列)
file1.csv
a,b,c,d
1,2,0,4
2,0,3,5
3,0,4,6
4,8,7,0
file2.csv
a,b,c,d,c
1,2,0,3,0
2,3,4,5,4
3,6,2,0,2
4,2,3,5,3
从技术上讲,代码应该为file1.csv提供4列(a,b,c,d),为file2.csv提供4列(a,b,c,d - 列c是重复的。)我知道使用dim(df)[2]将给出每个文件中的列数,但如果我必须为100个文件执行,我应该怎么做?
答案 0 :(得分:2)
如果列名足以确定重复的列,则执行此操作的一种简单快捷的方法是使用readLines()
读取每个文件的第一行,根据文件分隔符进行拆分(" ,")与strsplit()
,然后找到返回的唯一向量的长度。
您可以将其包装在sapply
或lapply
中以迭代文件列表。
files <- c("file1.csv", "file2.csv")
ncolumns <- sapply(files, function(f) {
header.line <- readLines(f, n=1)
length(unique(strsplit(header.line, ",")[[1]]))
})
ncolumns
# file1.csv file2.csv
# 4 4
假设列名足以确定唯一性,这将更快,因为您不必加载整个csv文件。
答案 1 :(得分:1)
我会使用一个循环来依次读取每个文件。您不希望同时打开它们,否则可能会耗尽内存。
获取文件列表:
f = list.files("./dir/", pattern="csv")
读取文件,查找唯一列并将结果写入变量:
answer = sapply(f, function(i){
# read the file
x = read.csv(i)
# extract column names and then get the unique ones
x = unique(colnames(x))
# return the number of column names
length(x)
})
然后,您可以查看文件长度:
# Summary statistics
summary(answer)
# Boxplot
boxplot(answer)
# Plot of number of columns vs names (probably messy with 100)
barplot(answer, names.arg=f)
答案 2 :(得分:0)
您可以尝试一起使用length()和unique()函数来计算唯一列名的数量。例如:
data <- data.frame(matrix(c(1:12), nrow=3, ncol=4))
colnames(data) <- c("a","b","c","b")
length(unique(colnames(data)))
根据上传过程的不同,您可以尝试将其整合到循环中或作为批处理过程运行。
答案 3 :(得分:0)
如果列名不仅仅是装饰:f
计算数据框X
的唯一列数:
f <- function( X )
{
A <- mapply(c,as.list(X),colnames(X))
sum( apply(A,2,function(col)
{
1 / sum( colSums( matrix(!(rep(col,ncol(A))==c(A)),nrow(A)) ) == 0 )
} ) )
}
示例:
> X1 <- data.frame( a = 1:3, b = 5:7, c = 3:1, d = 9:7 )
> X2 <- cbind( X1, c=4:2 )
> X3 <- cbind( X1, c=1:3 )
> X4 <- cbind( X1, e=5:7 )
> X5 <- cbind( X1, b=5:7 )
> X1
a b c d
1 1 5 3 9
2 2 6 2 8
3 3 7 1 7
> X2
a b c d c
1 1 5 3 9 4
2 2 6 2 8 3
3 3 7 1 7 2
> X3
a b c d c
1 1 5 3 9 1
2 2 6 2 8 2
3 3 7 1 7 3
> X4
a b c d e
1 1 5 3 9 5
2 2 6 2 8 6
3 3 7 1 7 7
> X5
a b c d b
1 1 5 3 9 5
2 2 6 2 8 6
3 3 7 1 7 7
>
> f(X1)
[1] 4
> f(X2)
[1] 5
> f(X3)
[1] 5
> f(X4)
[1] 5
> f(X5)
[1] 4
> f(cbind(X1,X1))
[1] 4
> f(cbind(X1,X5))
[1] 4
> f(cbind(X1,X2))
[1] 5
> f(cbind(X2,X3))
[1] 6
>