如何使用包含if-else结构的函数到每个列使用R.

che*_*omo 2 if-statement r apply lapply dataframe

数据框sg如下:

 v1 v2 v3 
 A  B  C  
 B  A  B  
 C  A  A  
Run Code Online (Sandbox Code Playgroud)

我用了一个功能

definition <- funciton(x){
  if (x =='A') definition <- paste(x, ": MINIMUM_RED")   
  else if (x =='B') definition <- paste(x, ": PASSIVE_RED")   ## Passive red (no green demand during red)
  else if (x =='C') definition <- paste(x, ": RED_REQUEST")   ## During red the group has a green demand
  else if (x =='D') definition <- paste(x, ": RED_PRIORITY")  
  else if (x =='E') definition <- paste(x, ": RED_PRIVILEGE")  ## During red possilbe to go green
  else  definition <- paste(x, ": RED_WAIT")   ## 
}
Run Code Online (Sandbox Code Playgroud)

我想对数据框sg中的每个值使用函数定义,所以我使用了apply函数:

sgdf <- apply(sg,2,defination)
Run Code Online (Sandbox Code Playgroud)

结果如下:

     [,1]              [,2]              [,3]             
[1,] "A : MINIMUM_RED" "B : PASSIVE_RED" "C : RED_REQUEST"
[2,] "B : MINIMUM_RED" "A : PASSIVE_RED" "B : RED_REQUEST"
[3,] "C : MINIMUM_RED" "A : PASSIVE_RED" "A : RED_REQUEST"
Run Code Online (Sandbox Code Playgroud)

显然,该函数只适用于每列中的第一个元素,是否可以通过任何方式获得每个值的正确定义?

nic*_*ico 5

您可以使用列表将每个字符映射到定义.

例如

sg <- data.frame(v1=c("A", "B", "C"),
                 v2=c("B", "A", "A"),
                 v3=c("C", "A", "A")) 

defs <- list("A" = "MINIMUM_RED",
         "B" = "PASSIVE_RED",
         "C" = "RED_REQUEST",
         "D" = "RED_PRIORITY",
         "E" = "RED_PRIVILEGE")

# Convert the data frame in a matrix, so we can use it to index the list
tmp <- as.matrix(sg)

# note that paste works on vectors
res <- matrix(paste(tmp, defs[tmp]), ncol=ncol(tmp))
Run Code Online (Sandbox Code Playgroud)

导致:

     [,1]            [,2]            [,3]           
[1,] "A MINIMUM_RED" "B PASSIVE_RED" "C RED_REQUEST"
[2,] "B PASSIVE_RED" "A MINIMUM_RED" "A MINIMUM_RED"
[3,] "C RED_REQUEST" "A MINIMUM_RED" "A MINIMUM_RED"
Run Code Online (Sandbox Code Playgroud)