如何在R中将列表(strsplit输出)转换为逻辑数据帧(根据列名)
这是我的第一篇文章,显然,我没有编程经验 问题: 我有一个200个字符向量的列表,每个从0到7个元素不等:(这个列表是strsplit函数的输出) 我还有一个输入中所有潜在字符串的字符串:如何在R中将列表(strsplit输出)转换为逻辑数据帧(根据列名),r,list,boolean-logic,strsplit,R,List,Boolean Logic,Strsplit,这是我的第一篇文章,显然,我没有编程经验 问题: 我有一个200个字符向量的列表,每个从0到7个元素不等:(这个列表是strsplit函数的输出) 我还有一个输入中所有潜在字符串的字符串: possible_strings <- c("foo","bar","hello",...) 我尝试了非常广泛的转换,得到的最远的结果是一个数据帧,其中包含所有可能的字符串作为列名,所有行中都有字符串,并用NAs填充(我在过程中使用了rbind.fill) 任何帮助都将不胜感激 谢谢 在最初的问题中,
possible_strings <- c("foo","bar","hello",...)
我尝试了非常广泛的转换,得到的最远的结果是一个数据帧,其中包含所有可能的字符串作为列名,所有行中都有字符串,并用NAs填充(我在过程中使用了rbind.fill)
任何帮助都将不胜感激
谢谢 在最初的问题中,您说希望结果是一个数据帧,但您显示的结果,
res
,实际上是一个矩阵。因此,我下面的第一个结果是一个矩阵,然后我使用as.data.frame()
将其转换为数据帧
使用%中的sapply()
和%可以相当轻松地完成此操作sapply()
一次只列出一个元素,并在每个元素上应用%
中的%函数,查找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
>以矩阵形式输入possStr d colnames(d)d##
#foo bar norf你好
#[1,]对错
#[2,]假假假真假
#[3,]错
#[4]假假假真
>as.data.frame(d)##转换为数据帧
#foo bar norf你好
#1真假
#2假假真假
#3假假假假假
#4假假假真
您可以使用as.data.frame
将生成的矩阵转换为data.frame,然后使用names(df)设置名称谢谢,进行了编辑。但是期望的结果是矩阵形式的,所以我将把它作为一个矩阵,并添加名称谢谢您的超快速响应。我应该说得更清楚一点:输入[2][1]是possStr的一部分,这不仅对我很重要。同样重要的是,这会在其自身名称的列(此处为“norf”列)中产生正确的结果。但是,如果这里有另一个表达式,例如“hello”,那么在“hello”列中应该会出现一个TRUE,等等。我尝试了你的解决方案,事实上,它正是我想要的。非常感谢你的帮助!令人惊叹的。很高兴我能帮忙。顺便说一下,请记住,NA
值从此结果中消失,除非您在possStr中搜索它们。不确定你是否需要它们。
> 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
> 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