Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 循环调用向量列表的元素_R_List_Loops_Vector - Fatal编程技术网

R 循环调用向量列表的元素

R 循环调用向量列表的元素,r,list,loops,vector,R,List,Loops,Vector,我有一个数据框,其中有一些模糊的观察名称,我想给它们添加一些分类。我遇到的一个问题是,一些观察名称与我想要分配的多个类相匹配,因此我决定为每个类添加一列,并根据观察是否与该类相关来填充True/False 以下是一个示例数据帧: col1 <- c(1:8) col2 <- c("aa", "bb", "ab", "ba") df <- data.frame(col1,col2) 我得到的类标准向量是: Class1 <- "aa" #

我有一个数据框,其中有一些模糊的观察名称,我想给它们添加一些分类。我遇到的一个问题是,一些观察名称与我想要分配的多个类相匹配,因此我决定为每个类添加一列,并根据观察是否与该类相关来填充True/False

以下是一个示例数据帧:

col1 <- c(1:8)
col2 <- c("aa", "bb", "ab", "ba")
df <- data.frame(col1,col2)
我得到的类标准向量是:

Class1 <- "aa"                  # A Only
Class2 <- "bb"                  # B Only
Class3 <- c("ab", "ba")         # Diff symbols
Class4 <- c("ab", "ba", "aa")   # All A
Class5 <- c("ab", "ba", "bb")   # All B 

Class1问题在于
Classes
中的值是一个列表,使用单括号运算符(
[
)返回的是一个列表对象,而不是列表中包含的对象。当列表中包含的项只有一个元素时,
%in%
运算符会执行您所期望的操作(例如,
Class1
),但当列表中的项较长时(例如,
Class3
)。具体而言,
df$col2%在%Classes[i]
中测试
df$col2
的任何元素是否等于
Classes[i]
的成员,而
Classes[i]不能为真
的长度大于1


解决方案是,在这一行中,
df[df$col2%in%Classes[i],2+i]注意如何使用括号
[
[
对列表进行索引。使用
[
返回包含所选索引的新列表,
[
返回所选索引中实际包含的对象

例如,使用您的代码:

> Classes[1] # returns a list
[[1]]
[1] "ab" "ba"

> Classes[[1]] # returns a vector
[1] "ab" "ba"
使用双括号,即将循环代码更改为:

for (i in 1:length(ClassName)) df[df$col2 %in% Classes[[i]], 2 + i] <- "x"
当然,还有其他更适合(例如,更容易阅读)做你想做的事情的方法。例如:

df$contains.a <- grepl("a", df$col2)

您好。非常感谢您的回复这正是我想要的。我知道这一定很简单,我错过了非常感谢您的建议!您上次的建议在他的案例中也非常有效!不幸的是,我在原著中有多个查找模式,因此选择列表更合适
df[df$col2 %in% Class3, 5] <- "x"

  col1 col2 A Only B Only Diff symbols All A All B
1    1   aa      x   <NA>         <NA>  <NA>  <NA>
2    2   bb   <NA>      x         <NA>  <NA>  <NA>
3    3   ab   <NA>   <NA>            x  <NA>  <NA>
4    4   ba   <NA>   <NA>            x  <NA>  <NA>
5    5   aa      x   <NA>         <NA>  <NA>  <NA>
6    6   bb   <NA>      x         <NA>  <NA>  <NA>
7    7   ab   <NA>   <NA>            x  <NA>  <NA>
8    8   ba   <NA>   <NA>            x  <NA>  <NA>
> Classes[1] # returns a list
[[1]]
[1] "ab" "ba"

> Classes[[1]] # returns a vector
[1] "ab" "ba"
for (i in 1:length(ClassName)) df[df$col2 %in% Classes[[i]], 2 + i] <- "x"
> df
  col1 col2 A Only B Only Diff symbols All A All B
1    1   aa   <NA>      x         <NA>     x  <NA>
2    2   bb   <NA>   <NA>            x  <NA>     x
3    3   ab      x      x            x  <NA>  <NA>
4    4   ba      x      x            x  <NA>  <NA>
5    5   aa   <NA>      x         <NA>     x  <NA>
6    6   bb   <NA>   <NA>            x  <NA>     x
7    7   ab      x      x            x  <NA>  <NA>
8    8   ba      x      x            x  <NA>  <NA>
df$contains.a <- grepl("a", df$col2)
df$contains.a <- ifelse(grepl("a", df$col2), "x", NA)