使用 if 或 ifelse

Using if or ifelse

我有一个数据框,我需要在其中根据另一列中变量的值在不同的列中进行单个观察。我是编程新手,很难找到一个我可以遵循的具体示例。当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))

上面的

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

您的代码几乎可以正常工作。主要的混淆似乎来自 ifelse 的用法(您的直觉是正确的):

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

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

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

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

另一种不用 if 或 ifelse 的方法是这样的,如果我理解你的问题的话:

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

你已经有了几个关于 base 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