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)
显然,该函数只适用于每列中的第一个元素,是否可以通过任何方式获得每个值的正确定义?
您可以使用列表将每个字符映射到定义.
例如
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)
| 归档时间: |
|
| 查看次数: |
345 次 |
| 最近记录: |