如何将列表(strsplit输出)转换为R中的逻辑数据帧(根据列名称)

时间:2014-06-07 01:56:26

标签: r list boolean-logic strsplit

这是我的第一篇文章,显然,我没有编程经验。

问题:

我有一个200个字符向量的列表,每个向量范围从0到7个元素:(此列表是strsplit函数的输出)。

>input

> [[1]]
>> [1] "foo" "bar" "norf"
> [[2]]
>> [1] "norf"
> [[3]]
>> NA
.....
> [[200]]
>> [1] "hello" "norf"

我在输入中也有一个包含所有潜在字符串的字符串:

possible_strings <- c("foo","bar","hello",...)

我想将其转换为以下格式的数据框(或完成工作的类似对象):

> res
        foo   bar   norf  hello
[1,  ]  TRUE  TRUE  TRUE  FALSE
[2,  ]  FALSE FALSE TRUE  FALSE
[3,  ]  FALSE FALSE FALSE FALSE
[...]
[200,]  FALSE FALSE TRUE  TRUE

我非常广泛地尝试转换它,我得到的最远的是一个数据框,其中所有可能的字符串都是列名,所有行中都有字符串,填充了NAs(我在过程中使用了rbind.fill)。 / p>

非常感谢任何帮助,

谢谢!

1 个答案:

答案 0 :(得分:2)

在原始问题中,您说您希望结果是数据框,但您显示的结果res实际上是一个矩阵。因此,下面的第一个结果是矩阵,然后我将其转换为as.data.frame()的数据框。

使用sapply()%in%可以相当轻松地完成此操作。 sapply()一次列出一个元素,并在每个元素上应用函数%in%,查找possStr的元素并返回逻辑结果。

> input <- list(c("foo", "bar", "norf"), "norf", NA, c("hello", "norf"))
> possStr <- c("foo", "bar", "norf", "hello")

> d <- t(sapply(input, function(x) possStr %in% x ))
> colnames(d) <- possStr 
> d                                       ## in matrix form
#        foo   bar  norf hello
# [1,]  TRUE  TRUE  TRUE FALSE
# [2,] FALSE FALSE  TRUE FALSE
# [3,] FALSE FALSE FALSE FALSE
# [4,] FALSE FALSE  TRUE  TRUE

> as.data.frame(d)                        ## convert to data frame
#     foo   bar  norf hello
# 1  TRUE  TRUE  TRUE FALSE
# 2 FALSE FALSE  TRUE FALSE
# 3 FALSE FALSE FALSE FALSE
# 4 FALSE FALSE  TRUE  TRUE