【问题标题】:How to transform a list (strsplit output) into logical data frame (according to column names) in R如何将列表(strsplit输出)转换为R中的逻辑数据框(根据列名)
【发布时间】:2014-06-07 01:56:26
【问题描述】:

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

问题:

我有一个包含 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

我尝试非常广泛地对其进行转换,我得到的最远的是一个数据框,其中包含所有可能的字符串作为列名,所有行中都有字符串,并填充有 NA(我在此过程中使用了 rbind.fill)。

任何帮助将不胜感激,

谢谢!

【问题讨论】:

    标签: r list boolean-logic strsplit


    【解决方案1】:

    在您最初的问题中,您说您希望结果是一个数据框,但是您显示的结果 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
    

    【讨论】:

    • 如果您愿意,可以使用as.data.frame 将生成的矩阵转换为data.frame,然后使用names(df) &lt;- possStr 设置名称。
    • 谢谢,进行了修改。但是想要的结果是矩阵形式,所以我将它保留为矩阵并添加名称
    • 感谢您的超快速响应。我应该更清楚地说明一件事:(例如)input[2][1] 是 possStr 的一部分不仅对我很重要。同样重要的是,这会在其自己的名称列(此处为“norf”列)中产生 TRUE。但是,如果这里是另一种表达方式,例如“你好”这应该导致“你好”列中的 TRUE 等。
    • 我尝试了您的解决方案,事实上,它完全符合我的要求。非常感谢您的帮助!
    • 太棒了。很高兴我能帮上忙。顺便说一句,请记住 NA 值已从此结果中消失,除非您在 possStr 中搜索它们。不确定你是否需要它们。
    猜你喜欢
    • 2019-12-03
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2021-11-21
    相关资源
    最近更新 更多