如何计算"唯一列的数量"在R中的每个csv中

时间:2015-10-23 13:55:11

标签: r

我是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个文件执行,我应该怎么做?

4 个答案:

答案 0 :(得分:2)

如果列名足以确定重复的列,则执行此操作的一种简单快捷的方法是使用readLines()读取每个文件的第一行,根据文件分隔符进行拆分(" ,")与strsplit(),然后找到返回的唯一向量的长度。

您可以将其包装在sapplylapply中以迭代文件列表。

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
>