如何在R中的ifelse语句中使用seq()函数

  • 本文关键字:seq 函数 语句 中的 ifelse r
  • 更新时间 :
  • 英文 :


在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")

最新更新