如果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"
答案 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是很大的依赖项。在单个任务中使用它可能会过大,在这种情况下,您宁愿使用其他建议的解决方案之一。