假设我有两个向量的列表,每个向量都带有6
元素。
我想使用if
语句比较这两个向量的值。然后,在那之后,我想根据if
语句的结果为每个元素分配一个名称。
x <- c(1,3,5,22,78,56)
y <- c(2,4,3,21,88,77)
z <- list(x, y)
然后,我想比较x
和y
的值,如下所示:
将x
的第一个元素与y
的第一个元素进行比较。如果x
的值大于y
,则第一个元素应命名为A
,否则应命名为B
。然后,输出应为6
元素,如下所示:
B B A A B B
for(i in 1:6){
if(z[[1]][i] > z[[2]][i])
z[[1]][[i]] <- "M"
else "B"
}
但是给我一张清单。
答案 0 :(得分:1)
R中的“最佳”解决方案通常使用向量而不是循环。前面的示例使用矢量。这是另一个这样的解决方案:
ifelse(z[[1]] > z[[2]], "A", "B")
如果您利用列表中的元素命名,则此示例可能会使代码更加用户友好。在此示例中,列表中的名称被选择为与变量名称相同。它们可以是任何语法有效的名称。并且list()
函数中的名称周围不需要引号。
z <- list(x = x, y = y)
ifelse(z$x > z$y, "A", "B")
答案 1 :(得分:0)
我不确定您是否有特定的原因想要使用'if'语句和列表,但是如果您只是在列中查找结果,则可以:
library(dplyr)
df <- tibble(
x = c(1,3,5,22,78,56),
y = c(2,4,3,21,88,77)
) %>%
mutate(result = case_when(
x > y ~ "A",
TRUE ~ "B"
))
case_when
通常可以很好地替代if语句,并且运行速度也更快。
如果您确实希望将结果包含在列表中,则可以在最后执行此操作:
df_list <- list(df$x, df$y, df$result)
,但在那种情况下,上面的注释可能提供了更直接的解决方案。