在ifelse语句中使用seq((函数时遇到问题。我有一个包含以下列的数据帧。
Dataframe(df): newmodel id
NewModel_1 30
NewModel_2 30
我需要增加这两行的id值,因为模型的id不应该相同。有一个常数值(99(,我们必须根据条件从中递增id值。
当我试图实现以下代码
df %>% mutate(id=ifelse(any(grepl("NewModel_", df$newmodel)), seq(from =99+1, by =1, length.out=2) , id))
我得到的输出是
newmodel id
NewModel_1 100
NewModel_1 100
预期的
newmode1 id
NewModel_1 100
NewModel_1 101
有人能解释一下为什么会发生这种事吗??
提前感谢
你在找这样的东西吗?
inds <- grepl('NewModel_', df$newmodel)
df$id[inds] <- seq(100, by = 1, length.out = sum(inds))
df
# newmodel id
#1 NewModel_1 100
#2 NewModel_2 101
数据
df <- structure(list(newmodel = c("NewModel_1", "NewModel_2"), id = c(30L,
30L)), class = "data.frame", row.names = c(NA, -2L))
我想是因为函数不知何故只得到了seq的第一项。
你可以试试这种方法,它在这里有效。
if(any(grepl("NewModel_", df$newmodel))) {
df$id <- seq(from = 99 + 1, length.out = (length(df$id)))
}
UPDATE:ifelse语句的返回只有一个值,所以您试图在单个元素中输入一个向量。另一种选择是使用应用函数。
ifelse(.)
失败的原因是ifelse
根据条件向量的输入长度对其输出长度进行键控;如果它比yes=
或no=
向量中的任何一个都短,则该额外长度被静默地忽略。在您的情况下,any(grepl("NewModel_", df$newmodel))
的长度永远不会超过1,因此输出的长度将为1。
例如:
ifelse(TRUE, 1:2, 3:4)
# [1] 1
ifelse(c(TRUE, FALSE), 1:2, 3:4)
# [1] 1 4
### and for an example of how R's overly-permissive recycling can go "wrong"
ifelse(c(TRUE, FALSE, TRUE), 1:2, 3:4)
# [1] 1 4 1
下面是一个使用match
为每个模型分配唯一整数的快速方法。
基数R
dat$newid <- 99 + match(dat$newmodel, unique(dat$newmodel))
dat
# newmodel id newid
# 1 NewModel_1 30 100
# 2 NewModel_2 30 101
dplyr
library(dplyr)
dat %>%
mutate(newid = 99 + match(newmodel, unique(newmodel)))
# newmodel id newid
# 1 NewModel_1 30 100
# 2 NewModel_2 30 101
数据
dat <- structure(list(newmodel = c("NewModel_1", "NewModel_2"), id = c(30L, 30L), newid = c(100, 101)), row.names = c(NA, -2L), class = "data.frame")