这是我的第一篇文章,显然,我没有编程经验。
问题:
我有一个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>
非常感谢任何帮助,
谢谢!
答案 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