【问题标题】:Using if or ifelse使用 if 或 ifelse
【发布时间】:2021-10-05 15:24:33
【问题描述】:

我有一个数据框,我需要根据另一列中变量的值在不同的列中进行单个观察。我是编程新手,很难找到可以遵循的具体示例。当 Item 值为 1615 时,Epoch 应该是 261,并且在 Item 的所有其他级别,Epoch 应该不会改变。数据框名称是 myevents。以下是数据示例:

Item Epoch
1612 260
1613 0
1614 0
1615 0
1616 0
1617 0
1618 262
1619 0

下面是输出的样子:

Item Epoch
1612 260
1613 0
1614 0
1615 261
1616 0
1617 0
1618 262
1619 0

这是我尝试过的:

myevents$Epoch=ifelse(myevents$Item==1615, myevents$Epoch==261, myevents$Epoch==myevents$Epoch)

myevents$Epoch=ifelse(myevents$Item==1615, myevents$Epoch==261, myevents$Epoch)

myevents$Epoch <- with(myevents, ifelse(myevents$Item==1615, myevents2$Epoch==261, myevents$Epoch==myevents$Epoch))

myevents$Epoch <- with(myevents, if(myevents$Item==1615, myevents$Epoch==261))

以上都不起作用,有些实际上用所有TRUEFALSE 字符替换了该列。我确保所有数字都被视为数字,并且为了以防万一,我确实尝试将它们用单引号括起来。我也尝试过仅使用if 的表单,但我无法弄清楚如何以实际运行的方式使用它。非常感谢任何帮助!

【问题讨论】:

    标签: r if-statement data-manipulation


    【解决方案1】:

    您的代码几乎可以工作了。主要的困惑似乎来自ifelse 的使用(你有正确的直觉使用):

    myevents$corrected <- ifelse(myevents$Item==1615, 261, myevents$Epoch)
    

    或者,如果你想直接覆盖:

    myevents$Epoch <- ifelse(myevents$Item==1615, 261, myevents$Epoch)
    

    ifelse 返回一个值,我们分配给一个变量,我们不在 ifelse 语句本身中分配。 (或者更准确地说,ifelse 返回其第二个或第三个参数,具体取决于第一个参数中的比较结果)

    【讨论】:

    • 感谢您的帮助!我想我只是有点不对劲。
    【解决方案2】:

    如果我很好地理解了您的问题,那么没有 if 或 ifelse 的另一种方法是:

    myevents[myevents$Item %in% 1615,"Epoch"]= 261
    

    【讨论】:

    • 这也行得通,谢谢!
    【解决方案3】:

    您已经有几个关于基本 R 代码的答案,所以我将其排除在我的答案之外。您当然可以使用您已经拥有的一些出色的基本 R 答案,但这里有几个使用 tidyverse 的其他选项。

    library(tidyverse)
    
    # random data to work with for the post
    set.seed(3625)                 # set seed for the sample()
    df <- data.frame(Item = sample(rep(1610:1620, times = 5)))
    #    Item
    # 1  1612
    # 2  1611
    # 3  1616
    # 4  1616
    # 5  1612
    # 6  1620
    # 7  1618
    # 8  1619
    # 9  1617
    # 10 1615
    #... 55 rows
        
    df <- df %>%           # using ifelse
      mutate(Epoch = ifelse(test = Item == 1612,
                            yes = 260,
                            no = ifelse(test = Item == 1615,
                                        yes = 261,
                                        no = ifelse(test = Item == 1618,
                                                    yes = 262,
                                                    no = 0))))
    #    Item Epoch
    # 1  1612   260
    # 2  1611     0
    # 3  1616     0
    # 4  1616     0
    # 5  1612   260
    # 6  1620     0
    # 7  1618   262
    # 8  1619     0
    # 9  1617     0
    # 10 1615   261 
    #... 55 rows
    
    df <- df %>% 
      mutate(Epoch2 = case_when(      # alternative to ifelse
        Item == 1612 ~ 260,
        Item == 1615 ~ 261,
        Item == 1618 ~ 262,
        TRUE ~ 0))
    #    Item Epoch Epoch2
    # 1  1612   260    260
    # 2  1611     0      0
    # 3  1616     0      0
    # 4  1616     0      0
    # 5  1612   260    260
    # 6  1620     0      0
    # 7  1618   262    262
    # 8  1619     0      0
    # 9  1617     0      0
    # 10 1615   261    261 
    #... 55 rows
    

    【讨论】:

    • 也许我误解了你想说的意思,但你的意思是 “当你独立调用每个向量(data$column)时,你不再链接不同的行。” dplyr 版本中的排序取决于与基本 R 解决方案相同的保证。毕竟,data.frame 只是列表的列表......另外,我不明白嵌套的ifelse...
    • @dario 是的,我说错了。我将编辑我的帖子并将其删除,但我想先拥有它。 ifelse() 确实会迭代。出于某种原因,我在想别的。至于嵌套的ifelse(),如果你这样做,你不必先创建一个带有任意值的列,你需要一个一个设置。但是,您当然应该使用最适合您的方法。如果您想将值分配给预填充的列,也有很多方法可以实现。
    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多