根据一列中的条件在另一列中设置条件

时间:2020-08-18 08:13:13

标签: r

如果df $ nr中的值小于5,我希望它在其旁边的列中说A。如果正好是5,它应该说B,如果正好是5,它应该说C。有建议吗?

set.seed(1)
nr <- sample(10,10)
dat <- rep(1,10)
df <- data.frame(nr,dat)
df

ifelse(df$nr<=5,df$dat[df$dat=="A"],1)

for(i in df$nr) if(i %in% <5) df$dat <- "A"
for(i in df$nr) if(i %in% ==5) df$dat <- "B"
for(i in df$nr) if(i %in% >5) df$dat <- "C"

2 个答案:

答案 0 :(得分:1)

这是基数为R的单线。sign函数对于任何负值返回-1,对于0表示返回0,对于正数返回1。因此nr - 5将为5以下的任何东西提供-1,为5提供5的任何东西,为5以上的任何东西提供1,如果我们对此加2,它将为我们提供数字1,2,3代替-1, 0,1。我们可以使用1、2、3作为LETTERS的索引来获取适当的“ A”,“ B”或“ C”:

within(df, dat <- LETTERS[sign(nr - 5) + 2])
#> #>    nr dat
#> #> 1   9   C
#> #> 2   4   A
#> #> 3   7   C
#> #> 4   1   A
#> #> 5   2   A
#> #> 6   5   B
#> #> 7   3   A
#> #> 8  10   C
#> #> 9   6   C
#> #> 10  8   C

答案 1 :(得分:1)

使用tidyverse的另一种方法比艾伦的答案更长,但imo更易于理解:

library(tidyverse)
df <- df %>%
      mutate( dat = case_when( nr < 5 ~ "A",
                               nr == 5 ~ "B",
                               nr > 5 ~ "C"))

请注意,根据艾伦斯(Allans)的评论,tidyverse是很大的依赖项。在单个任务中使用它可能会过大,在这种情况下,您宁愿使用其他建议的解决方案之一。