R 循环中的多个不同条件和if状态

R 循环中的多个不同条件和if状态,r,for-loop,if-statement,R,For Loop,If Statement,我想根据一些条件将A:U中的不同字母分配给新的列向量,这些条件取决于采用数字1:99的不同列 我提出了以下解决方案,但我想更有效地编写它 for (i in 1:99){ if (i %in% 1:3 == T ){ id<-which(H07_NACE$NACE2.Code==i) H07_NACE$NACE2.Sectors[id]<-"A" } ............. if (i %in% 45:60 ==

我想根据一些条件将
A:U
中的不同字母分配给新的列向量,这些条件取决于采用数字
1:99
的不同列

我提出了以下解决方案,但我想更有效地编写它

for (i in 1:99){

  if (i %in% 1:3 == T  ){
    id<-which(H07_NACE$NACE2.Code==i)
    H07_NACE$NACE2.Sectors[id]<-"A"
  }


   .............         

    if (i %in% 45:60 == T  ){
      id<-which(H07_NACE$NACE2.Code==i)
      H07_NACE$NACE2.Sectors[id]<-"D"
    }
      .....................


     if (i == 99  ){
id<-which(H07_NACE$NACE2.Code==i)
H07_NACE$NACE2.Sectors[id]<-"U"
  }

}
for(1:99中的i){
如果(i%in%1:3==T){

id这里有一个快速而肮脏的解决方案,应该可以完成这项工作(我相信有更高效/优雅的方法来完成)。我们可以设置一个约束向量,并从那里使用索引来生成所需的结果

## Here is some random data that resembles the OP's
set.seed(3)
H07_NACE <- data.frame(NACE2.Code = sample(99, replace = TRUE))

## "T" is the 20th element... we need to gurantee
## that the number corresponding to "U" 
## corresponds to max(NACE2.Code)
maxCode <- max(H07_NACE$NACE2.Code)
constraintVec <- sort(sample(maxCode - 1, 20))
constraintVec <- c(constraintVec, maxCode)

H07_NACE$NACE2.Sector <- LETTERS[vapply(H07_NACE$NACE2.Code, function(x) {
                                            which(constraintVec >= x)[1]
                                    }, 1L)]

## Add optional check column to ensure we are mapping the 
## Code to the correct Sector
H07_NACE$NACE2.Check <- constraintVec[vapply(H07_NACE$NACE2.Code, function(x) {
    which(constraintVec >= x)[1]
}, 1L)]

head(H07_NACE)
  NACE2.Code NACE2.Sector NACE2.Check
1         17            E          18
2         80            R          85
3         39            K          54
4         33            J          37
5         60            N          66
6         60            N          66

这里有一个快速而肮脏的解决方案,应该可以完成这项工作(我相信有更高效/优雅的方法来完成)。我们可以设置一个约束向量,并从中使用索引来生成所需的结果

## Here is some random data that resembles the OP's
set.seed(3)
H07_NACE <- data.frame(NACE2.Code = sample(99, replace = TRUE))

## "T" is the 20th element... we need to gurantee
## that the number corresponding to "U" 
## corresponds to max(NACE2.Code)
maxCode <- max(H07_NACE$NACE2.Code)
constraintVec <- sort(sample(maxCode - 1, 20))
constraintVec <- c(constraintVec, maxCode)

H07_NACE$NACE2.Sector <- LETTERS[vapply(H07_NACE$NACE2.Code, function(x) {
                                            which(constraintVec >= x)[1]
                                    }, 1L)]

## Add optional check column to ensure we are mapping the 
## Code to the correct Sector
H07_NACE$NACE2.Check <- constraintVec[vapply(H07_NACE$NACE2.Code, function(x) {
    which(constraintVec >= x)[1]
}, 1L)]

head(H07_NACE)
  NACE2.Code NACE2.Sector NACE2.Check
1         17            E          18
2         80            R          85
3         39            K          54
4         33            J          37
5         60            N          66
6         60            N          66

这里有两个
tidyverse
示例,尽管我不能完全确定原始海报的真正要求

library(tidyverse)

data.frame(NACE2.Code = sample(99, replace = TRUE)) %>% 
  mutate(Sectors = ifelse(NACE2.Code %in% 1:3, "A", 
                          ifelse(NACE2.Code %in% 45:60, "D",
                                 ifelse(NACE2.Code ==99, "U", NA))))

data.frame(NACE2.Code = sample(99, replace = TRUE)) %>% 
  mutate(Sectors = case_when(NACE2.Code %in% 1:3 ~ "A", 
                             NACE2.Code %in% 45:60 ~ "D",
                             NACE2.Code ==99 ~ "U")) %>% 
  drop_na

这里有两个
tidyverse
示例,尽管我不能完全确定原始海报的真正要求

library(tidyverse)

data.frame(NACE2.Code = sample(99, replace = TRUE)) %>% 
  mutate(Sectors = ifelse(NACE2.Code %in% 1:3, "A", 
                          ifelse(NACE2.Code %in% 45:60, "D",
                                 ifelse(NACE2.Code ==99, "U", NA))))

data.frame(NACE2.Code = sample(99, replace = TRUE)) %>% 
  mutate(Sectors = case_when(NACE2.Code %in% 1:3 ~ "A", 
                             NACE2.Code %in% 45:60 ~ "D",
                             NACE2.Code ==99 ~ "U")) %>% 
  drop_na

用户已请求根据给定规则将
H07\U NACE$NACE 2.code
中给出的数字映射到
“A”
“U”
,用户已在许多
if
条款中硬编码

一种更灵活的方法(代码也不那么繁琐)是使用查找表(或Joseph Wood称之为约束向量)

使用
data.table
,我们可以使用滚动连接或非等更新连接来进行映射

要映射的示例数据 如果要更新
H07\u NACE
,我们可以通过

setDT(H07_NACE)[, NACE2.Sector := lookup[H07_NACE, on = .(Code = NACE2.Code), 
  roll = TRUE, Sector]][]
非等更新联接 对于非等更新联接,我们通过给出上下限来指定映射规则

lookup2 <- lookup[, .(Sector, lower = Code, 
                      upper = shift(Code - 1L, type = "lead", fill = max(Code)))]
lookup2
新列由创建

setDT(H07_NACE)[lookup2, on = .(NACE2.Code >= lower, NACE2.Code <= upper), 
                NACE2.Sector := Sector][]

用户已请求根据给定规则将
H07\U NACE$NACE 2.code
中给出的数字映射到
“A”
“U”
,用户已在许多
if
条款中硬编码

一种更灵活的方法(代码也不那么繁琐)是使用查找表(或Joseph Wood称之为约束向量)

使用
data.table
,我们可以使用滚动连接或非等更新连接来进行映射

要映射的示例数据 如果要更新
H07\u NACE
,我们可以通过

setDT(H07_NACE)[, NACE2.Sector := lookup[H07_NACE, on = .(Code = NACE2.Code), 
  roll = TRUE, Sector]][]
非等更新联接 对于非等更新联接,我们通过给出上下限来指定映射规则

lookup2 <- lookup[, .(Sector, lower = Code, 
                      upper = shift(Code - 1L, type = "lead", fill = max(Code)))]
lookup2
新列由创建

setDT(H07_NACE)[lookup2, on = .(NACE2.Code >= lower, NACE2.Code <= upper), 
                NACE2.Sector := Sector][]

你能给我们一些数据来处理和期望的输出吗?我会用
if-else
s而不是普通的
if
s,因为你的条件看起来是独立的,所以一旦找到正确的括号,它就不会检查其余的。在你当前的代码中,它会计算所有的条件。你可以使用一个带有约束和少量索引的向量你能给我们一些要处理的数据和预期的输出吗?我会使用
if-else
s而不是普通的
if
s,因为你的条件似乎是独立的,所以一旦找到正确的括号,它就不会检查其余的。在你当前的代码中,它会计算所有条件。你可以使用向量r约束和一点索引应该可以很快得到您想要的东西可能类似于
findInterval(代码,约束)
可以用来简化。不清楚,因为OP使用了伪代码…我没有发布任何数据帧,因为我认为生成一个数据帧很简单。我最关心的是找到另一种方法来完成伪代码显示的完全相同的事情。我将很快更新。可能类似于
findInterval(代码,约束)
可以用来简化。不清楚,因为OP使用了伪代码…我没有发布任何数据帧,因为我认为生成一个数据帧很简单。我最关心的是找到另一种方法来完成伪代码显示的完全相同的事情。我将很快更新。
lookup2 <- lookup[, .(Sector, lower = Code, 
                      upper = shift(Code - 1L, type = "lead", fill = max(Code)))]
lookup2
    Sector lower upper
 1:      A     1     3
 2:      B     4    20
 3:      C    21    44
 4:      D    45    60
 5:      E    61    61
 6:      F    62    62
 7:      G    63    63
 8:      H    64    64
 9:      I    65    65
10:      J    66    66
11:      K    67    67
12:      L    68    68
13:      M    69    69
14:      N    70    70
15:      O    71    71
16:      P    72    72
17:      Q    73    73
18:      R    74    74
19:      S    75    97
20:      T    98    98
21:      U    99    99
    Sector lower upper
setDT(H07_NACE)[lookup2, on = .(NACE2.Code >= lower, NACE2.Code <= upper), 
                NACE2.Sector := Sector][]
    NACE2.Code NACE2.Sector
 1:         27            C
 2:         37            C
 3:         57            D
 4:         90            S
 5:         20            B
 6:         89            S
 7:         94            S
 8:         66            J
 9:         63            G
10:          7            B