我正在尝试对从我要比较的两个文本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",...)
手动创建列表,则可以使用。我做错了什么,我该怎么做呢?
答案 0 :(得分:3)
您在此处遇到一些问题需要解决才能让stack
按照您的意愿运作。
stack
不会对factor
个变量做任何事情。stack
适用于命名列表。stack
不适用于嵌套列表,data.frame
是一种特殊类型的列表。让我们来看看每一个:
确保您的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