在R中查找包含向量中值的列表对象

3

我的数据框

set.seed(1)
df <- data_frame(col1 = c(1:49), col2 = sample(c(0:20), 49, replace = T))

我的清单

fields <- list(A = c(2:4, 12:16, 24:28, 36:40, 48:49), 
           B = c(6:10, 18:22, 30:34, 42:46))

我希望创建一个新的列,其中包含fields中向量对象的名称,该向量包含df $ col1中的数字

我已经针对fields创建了一个条件for循环:

col1 <- df$col1

for (i in col1) {

if (col1[i] %in% fields[[1]] == T) {
col1[i] <- names(fields)[1]

}  else if (col1[i] %in% fields[[2]] == T) {
col1[i] <- names(fields)[2]

 }
}

虽然这种方法可以实现目标,我可以将得到的新向量col1分配给我的数据框,但是这对我来说似乎不太有效率,特别是因为我还有包含更多对象的列表。 我想要这样做的原因:我希望使用ggplot和dplyr根据它们在我的列表(fields,以及其他列表)中的位置对观察结果进行分组和汇总。希望我的问题已经表述清楚了。谢谢! 编辑 我创建了一个更通用的函数,其中包含一个嵌套的for循环。
find_object <- function(x, list) {  

for (j in 1:length(list)) {
  for (i in 1:length(x)) {

if (x[i] %in% list[[j]] == TRUE) {
  x[i] <- names(list)[j]
   }
  }
 }
x
}

find_object(col1, fields)

这大致是我想要的-但这是一个嵌套的for循环,我听说这样做是不好的...有没有更好的解决方案?谢谢

2个回答

2
更好的方法是将list转换为data.frame,然后执行连接/合并操作:
library(dplyr)
fields.df <- stack(fields) %>% mutate(ind = as.character(ind))
df %>% left_join(fields.df, by = c('col1' = 'values'))
#     col1  col2   ind
#    <int> <int> <chr>
#  1     1     5  <NA>
#  2     2     7     A
#  3     3    12     A
#  4     4    19     A
#  5     5     4  <NA>
#  6     6    18     B
#  7     7    19     B
#  8     8    13     B
#  9     9    13     B
# 10    10     1     B

注意:我使用来自dplyrleft_join,因为您正在使用data_frame。基本R的merge也应该可以工作。


@Tjebo stack 是基于 R 的。我注意到在 rlang 中的 stack 也给出了相同的结果。 - mt1022

1
另一种方法是在使用 stack() 创建数据框之后使用 match()
library(dplyr)

foo <- stack(fields)
mutate(df, whatever = foo$ind[match(df$col1, foo$values)])

    col1  col2 whatever
   <int> <int> <fctr>  
 1     1     5 <NA>    
 2     2     7 A       
 3     3    12 A       
 4     4    19 A       
 5     5     4 <NA>    
 6     6    18 B       
 7     7    19 B       
 8     8    13 B       
 9     9    13 B       
10    10     1 B       

@Tjebo 不用担心。我只是想提出另一个想法。 - jazzurro
我偶然发现了我的旧问题,并决定在所有这段时间之后接受这个答案,因为我意识到使用 match 已经成为我的首选方法,而且我经常使用它。它简短而精简,也只使用基本的 R 代码。 - tjebo
1
@tjebo,我很高兴你喜欢match()函数。感谢你在五年后回到这个问题! - jazzurro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接