R:确定列表中的所有集合是否出现在数据框中
R: Determine if all sets in a list appear in a data frame
我需要弄清楚是否在数据框中找到了项目 ID 集。
如果我只查找一组 ID,则以下代码可以正常工作:
set <- c( id1, id2, etc...)
all(subSets %in% df[,rangeOfColumns])
但是,如果集合是我要检查的各种内容的列表,则此代码无法按预期工作,我不确定如何获得此功能。
我的目标示例:
set <- list()
set[[1]] <- c(1, 2)
set[[2]] <- c(2, 3)
df <- as.data.frame(cbind(c(1:4),c(2:5)))
all(set %in% df)
#Returns TRUE
这可能不容易理解,但它确实有效。数据框按列组织,因此按行执行操作并不总是那么简单。
# Your setup had some unnecessary complications. Here it is again
# more simply:
set <- list(1:2, 2:3)
d_f <- data.frame(1:4, 2:5) # df is already a function name so best not to use it again.
all(
sapply(seq_along(set),
function(i) any(
sapply(
lapply(1:nrow(d_f), function(j) set[[i]] == d_f[j,]),
all) # Does each element of set[[i]] equal the elements in df[j]?
)
) # Does it happen in any row of df?
) # It is true for all elements of set?
编辑:解决评论中的问题 好吧,如果它不是直截了当的,为什么不使用 df 的转置版本来使事情变得更容易?
因为数据框是一个列表,而不是矩阵。
做矩阵的事情(比如用 t
转置或使用 apply
)破坏(通常没有任何警告给用户)数据框应该是什么,这是一个向量列表长度相同。
当您在数据框上使用 t
或 apply
时,首先发生的事情是 as.matrix
应用于它。如果你的数据框有日期、字符或因子变量,那么整个事情都会被强制为 "character",它不会告诉你发生了这种情况。
可以使用 apply
(就像有人所做的那样)and/or t
为您的特定问题制定答案,但除非有人完全确定,否则它会有点脆弱数据框中变量的 类。
也许针对每个集合检查每一行,如果有任何行匹配,则 return 为 TRUE。那么如果每个集合都匹配,那么整个结果就是 TRUE。
all(sapply(set, function(s)
any(apply(df, 1, function(x) all(x==s)))))
我需要弄清楚是否在数据框中找到了项目 ID 集。
如果我只查找一组 ID,则以下代码可以正常工作:
set <- c( id1, id2, etc...)
all(subSets %in% df[,rangeOfColumns])
但是,如果集合是我要检查的各种内容的列表,则此代码无法按预期工作,我不确定如何获得此功能。
我的目标示例:
set <- list()
set[[1]] <- c(1, 2)
set[[2]] <- c(2, 3)
df <- as.data.frame(cbind(c(1:4),c(2:5)))
all(set %in% df)
#Returns TRUE
这可能不容易理解,但它确实有效。数据框按列组织,因此按行执行操作并不总是那么简单。
# Your setup had some unnecessary complications. Here it is again
# more simply:
set <- list(1:2, 2:3)
d_f <- data.frame(1:4, 2:5) # df is already a function name so best not to use it again.
all(
sapply(seq_along(set),
function(i) any(
sapply(
lapply(1:nrow(d_f), function(j) set[[i]] == d_f[j,]),
all) # Does each element of set[[i]] equal the elements in df[j]?
)
) # Does it happen in any row of df?
) # It is true for all elements of set?
编辑:解决评论中的问题 好吧,如果它不是直截了当的,为什么不使用 df 的转置版本来使事情变得更容易?
因为数据框是一个列表,而不是矩阵。
做矩阵的事情(比如用 t
转置或使用 apply
)破坏(通常没有任何警告给用户)数据框应该是什么,这是一个向量列表长度相同。
当您在数据框上使用 t
或 apply
时,首先发生的事情是 as.matrix
应用于它。如果你的数据框有日期、字符或因子变量,那么整个事情都会被强制为 "character",它不会告诉你发生了这种情况。
可以使用 apply
(就像有人所做的那样)and/or t
为您的特定问题制定答案,但除非有人完全确定,否则它会有点脆弱数据框中变量的 类。
也许针对每个集合检查每一行,如果有任何行匹配,则 return 为 TRUE。那么如果每个集合都匹配,那么整个结果就是 TRUE。
all(sapply(set, function(s)
any(apply(df, 1, function(x) all(x==s)))))