簡體   English   中英

如何在 R 的 ifelse 語句中使用 seq() function

[英]How to use seq() function inside ifelse statement in R

在 ifelse 語句中使用 seq() function 時遇到問題。 我有一個 dataframe 包含以下列。

Dataframe(df): newmodel    id 
               NewModel_1  30
               NewModel_2  30

我需要增加這 2 行的 id 值,因為 model 的 id 不應該相同。 有一個常量值(99),我們必須根據條件增加 id 值。

當我嘗試實現以下代碼時

 df %>% mutate(id=ifelse(any(grepl("NewModel_", df$newmodel)), seq(from =99+1, by =1, length.out=2) , id))

我得到 output 作為

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

我猜是因為不知何故 function 只獲得了序列的第一項。

您可以嘗試這種方式,它在這里有效。

    if(any(grepl("NewModel_", df$newmodel))) {
df$id <- seq(from = 99 + 1, length.out = (length(df$id)))
}

更新: ifelse 語句的返回只有一個值,因此您嘗試在單個元素中輸入向量。 另一種方法是使用應用 function。

您的ifelse(.)失敗的原因是ifelse根據條件向量的輸入長度鍵入其 output 長度; 如果它比yes=no=向量中的任何一個都短,那么額外的長度將被忽略。 在您的情況下, any(grepl("NewModel_", df$newmodel))的長度永遠不會是 1,因此 output 的長度將是 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為每個模型分配唯一 integer 的快速方法。

底座 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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM