使用 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 有效,有些实际上用所有 TRUE
或 FALSE
字符替换了该列。我已确保所有数字都被视为数字,并且为了以防万一,我确实尝试将它们用单引号括起来。我也尝试过单独使用表单 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
我有一个数据框,我需要在其中根据另一列中变量的值在不同的列中进行单个观察。我是编程新手,很难找到一个我可以遵循的具体示例。当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 有效,有些实际上用所有 TRUE
或 FALSE
字符替换了该列。我已确保所有数字都被视为数字,并且为了以防万一,我确实尝试将它们用单引号括起来。我也尝试过单独使用表单 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