如何在R中使用if语句根据其值命名列表元素

时间:2019-05-05 10:42:57

标签: r

我的问题简而言之

假设我有两个向量的列表,每个向量都带有6元素。

我想使用if语句比较这两个向量的值。然后,在那之后,我想根据if语句的结果为每个元素分配一个名称。

示例:

 x <- c(1,3,5,22,78,56)
 y <- c(2,4,3,21,88,77)
 z <- list(x, y)

然后,我想比较xy的值,如下所示:

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"
}

但是给我一张清单。

2 个答案:

答案 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),但在那种情况下,上面的注释可能提供了更直接的解决方案。