gpt4 book ai didi

r - 在列表中查找包含 R 中矢量值的对象

转载 作者:行者123 更新时间:2023-12-01 13:26:57 24 4
gpt4 key购买 nike

我的数据框

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

我的 list

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 中的数字

我在字段上创建了条件循环:

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 根据它们在我的列表(字段,还有其他列表)中的位置对观察结果进行分组和总结。我希望从我的问题中可以清楚地知道我打算做什么。谢谢!

编辑

我创建了一个包含嵌套 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 循环,我听说这很糟糕......有没有人有更好的解决方案?谢谢

最佳答案

更好的方法是将 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

注意:我使用 dplyr 中的 left_join,因为您正在使用 data_frame。基础 R merge 也应该有效。

关于r - 在列表中查找包含 R 中矢量值的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48050015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com