如何堆叠两个csv文件的输入?

时间:2014-05-23 08:39:06

标签: r csv comparison

我正在尝试对从我要比较的两个文本csv文件加载的数据使用stack命令。我想使用crossprod(table(stack(data)))来查看不同列共有多少个字符串(在示例中它将是" dog"以及" cat")。 在此示例中,csv文件包含具有不同字符串数的列。

> one<-read.delim("one.csv",sep="\t",header=F)
> two<-read.delim("two.csv",sep="\t",header=F)

> one
       V1
1     dog
2 hamster
3   mouse
4     cat

> two
      V1
1    dog
2    cat
3 rabbit

> data<-list(one,two)
> stack(data)
Error in stack.default(data) : at least one vector element is required

如果我使用one<-c("dog",...)手动创建列表,则可以使用。我做错了什么,我该怎么做呢?

1 个答案:

答案 0 :(得分:3)

您在此处遇到一些问题需要解决才能让stack按照您的意愿运作。

  1. stack不会对factor个变量做任何事情。
  2. stack适用于命名列表。
  3. stack不适用于嵌套列表,data.frame是一种特殊类型的列表。
  4. 让我们来看看每一个:

    确保您的read.table包含stringsAsFactors = FALSE 。在这里,我创建了包含该参数的两个data.frame

    one <- data.frame(V1 = c("dog", "hamster", "mouse", "cat"), stringsAsFactors=FALSE)
    two <- data.frame(V1 = c("dog", "cat", "rabbit"), stringsAsFactors=FALSE)
    

    确保您的list是名为list

    data <- list(one = one, two = two)
    

    两个要求下来......测试。错误仍然存​​在......

    stack(data)
    # Error in stack.default(data) : at least one vector element is required
    

    “展平”您的list,但未完全使用recursive = FALSE使用stack进行测试:

    stack(unlist(data, recursive=FALSE))
    #    values    ind
    # 1     dog one.V1
    # 2 hamster one.V1
    # 3   mouse one.V1
    # 4     cat one.V1
    # 5     dog two.V1
    # 6     cat two.V1
    # 7  rabbit two.V1
    

    从那里,您可以执行t/crossprod

    tcrossprod(table(stack(unlist(data, recursive=FALSE))))
    #          values
    # values    cat dog hamster mouse rabbit
    #   cat       2   2       1     1      1
    #   dog       2   2       1     1      1
    #   hamster   1   1       1     1      0
    #   mouse     1   1       1     1      0
    #   rabbit    1   1       0     0      1