基本上我有一个矩阵和一行,其中有一个我想在列表中附加一个“1”,否则附加一个“0”
代码如下:
is.there.A <- function(a,b,c,d,e) {
library(combinat)
x <- c(a,b,c,d,e)
matrix <- matrix(combn(x,3), ncol=3, byrow=T)
row <- nrow(matrix)
list <- list()
for (i in seq(row)) {
if (matrix[i,] %in% "A") {c(list, "1")}
else {c(list, "0")}
print(list)
}
}
但它不起作用,这就出现了。
警告讯息:
1:if if(matrix [i,]%in%“A”){:
条件的长度> 1,只使用第一个元素
问题是如何克服这个目标以实现目标
答案 0 :(得分:1)
您打算测试"A" %in% matrix[i,]
,而不是相反。但请注意
row <- nrow(matrix)
list <- list()
for (i in seq(row)) {
if ("A" %in% matrix[i,]) {c(list, "1")}
else {c(list, "0")}
}
可以改写
rowSums(matrix == "A") > 0
它返回一个逻辑向量(TRUE / FALSE),这是您的函数最合适的输出。但是,如果您确实需要“1”或“0”的列表,则可以按如下方式进行换行:
as.list(ifelse(rowSums(matrix == "A") > 0, "1", "0"))
另请注意,命名对象matrix
是个坏主意,因为它也是R中函数的名称。
答案 1 :(得分:1)
您可以使用apply
is.there.A <- function(a,b,s,d,e) {
library(combinat)
x <- c(a,b,s,d,e)
.matrix <- matrix(combn(x,3), ncol=3, byrow=T)
any_A <- apply(.matrix, 1, `%in%`, x = 'A')
as.list(as.numeric(any_A))
}
永远不要在for循环中增长对象,预先分配然后填充。
避免使用函数名称命名对象(例如c
或matrix
或list
)