【问题标题】:Ifelse condition without creating NA'sIfelse 条件而不创建 NA
【发布时间】:2021-09-23 09:52:14
【问题描述】:

我有一个包含开始时间和停止时间的 data.frame。如果Start > 1 AND Stop

我可以放什么来代替NA,所以它会跳过不满足条件的行?

到目前为止我所拥有的:

data.frame$names <- ifelse(
    (data.frame$Start >=1) & (data.frame$Stop<=5),
    print('Name'), 
    NA)

我尝试像这样使用if,但什么也没发生:

if (data.frame$Start => 1 && data.frame$Stop <=5) {
    data.frame$names = print ('Name')
}

我想要一个新列,当Start=>1 AND StopStart>=5 AND Stop

        Start Stop Names
    1      1    2  name
    2      2    3  name
    3      3    4  name
    4      4    5  name
    5      5    6 name2
    6      6    7 name2
    7      7    8 name2
    8      8    9 name2
    9      9   10 name2
    10    10   11     

这是一个可重现的示例数据集:

Start<- c(1:10)
Stop<- c(2:11)
df=data.frame(Start,Stop)
df
       Start Stop
    1      1    2
    2      2    3
    3      3    4
    4      4    5
    5      5    6
    6      6    7
    7      7    8
    8      8    9
    9      9   10
    10    10   11

【问题讨论】:

  • 感谢您的评论,我刚刚添加了一个可重现的示例。

标签: r if-statement


【解决方案1】:

这是一个使用 case_when 的选项 -

library(dplyr)

df <- df %>%
  mutate(Names = case_when(Start >= 1 & Stop <= 5 ~ 'name', 
                           Start >= 5 & Stop <= 10 ~ 'name2', 
                           TRUE ~ ''))
df

#   Start Stop Names
#1      1    2  name
#2      2    3  name
#3      3    4  name
#4      4    5  name
#5      5    6 name2
#6      6    7 name2
#7      7    8 name2
#8      8    9 name2
#9      9   10 name2
#10    10   11      

【讨论】:

    【解决方案2】:

    您可以使用'' 来代替NA

    data.frame$Names <- ifelse(((data.frame$Start >1) & (data.frame$Stop<5)),print('Name'),'')
    

    编辑以下 cmets: 下面的 dplyr 解决方案优雅且易于阅读。在基础 R 中,您还可以像这样嵌入两个 ifelse

    df$Names <- ifelse(((df$Start >=1) & (df$Stop<=5)),print('Name'),
                  ifelse(((df$Start >=5) & (df$Stop<=10)),print('Name2'),''))
    
    > df
       Start Stop Names
    1      1    2  Name
    2      2    3  Name
    3      3    4  Name
    4      4    5  Name
    5      5    6 Name2
    6      6    7 Name2
    7      7    8 Name2
    8      8    9 Name2
    9      9   10 Name2
    10    10   11 
    

    【讨论】:

    • 谢谢你,Mata,但是当我想给下一个名字时,旧的名字会被覆盖:data.frame$names 5) & (data.frame) frame$Stop
    • @Maike 这很可能与''NA 无关,这正是您在列中输入的内容。我不确定我是否完全解决了您的问题,您能否举一个可重复的示例以及结果应该是什么样子?我的意思是,提供原始数据的示例和结果示例(不一定是您的真实数据)?这样我就可以测试转换。
    • 好的,我明白了。我只是在问题中添加了一个示例,希望它有效。谢谢!!
    猜你喜欢
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    相关资源
    最近更新 更多