嵌套在组中的条件
Conditonals nested in groups
我正在处理这样的数据:
ID Count Report Rank
X-01 1 4.2 2
X-01 2 2.7 1
X-01 3 5.8 3
X-01 4 14 5
X-01 5 9.2 4
X-02 1 6.8 2
X-02 2 17 4
X-02 3 13 3
X-02 4 22.7 5
X-02 5 4 1
Count是指传感器被触发的时间,Report是数值,Rank是Report中的排名。
我对其中的 6 个变量感兴趣:
If Count = 1 and Rank = 1 then Report
If Count = 1 and Rank = 2 then Report
If Count > 1 and Rank = 1 or 2, then -1
If Count = 1 and Rank = 3:5, -Report
If Count >= 2 and Rank = 3:10, 1
If Rank > 5 (there are multiple rows to each ID), 0
我已经尝试了 if (x) {} else if () {} 等和 ifelse() 多个嵌套,但我收到了很多红色文本!
Larger object length is not a multiple of shorter object length
很频繁。
到目前为止,我找到的唯一解决方案是通过 'ifelse' 计算一列中的每一行,然后将新列中的行相加,这既耗时又不优雅。
有什么想法吗?
您可以编写一个函数来指定给定每个输入组合的输出。
f1 <- function(count, rank, report){
# in case of missing count or rank data:
if (is.na(count) | is.na(rank)) return(NA)
if (count==1 & rank %in% 1:2) return(report)
if (count > 1 & rank %in% 1:2) return(-1)
if (count==1 & rank %in% 3:5) return(-report)
if (count >= 2 & rank %in% 3:10) return(1)
if (rank > 5) return(0)
return(NA)
}
接下来您可以使用 mapply
将此功能应用到您的 data.frame。
mapply(f1, count=d$Count, rank=d$Rank, report=d$Report)
[1] 4.2 -1.0 1.0 1.0 1.0 6.8 1.0 1.0 1.0 -1.0
编辑: 我更新了函数,以便它 returns NA
如果一些输入变量是 NA
.
鉴于此数据集:
d <- read.table(text='ID Count Report Rank
X-01 1 4.2 2
X-01 2 2.7 1
X-01 3 5.8 3
X-01 NA 4 2
X-01 2 5.5 NA
X-01 4 14 5
X-01 5 9.2 4
X-02 1 6.8 2
X-02 2 17 4
X-02 3 13 3
X-02 4 22.7 5
X-02 5 4 1', header=T)
我得到这个输出:
mapply(f1, count=d$Count, rank=d$Rank, report=d$Report)
[1] 4.2 -1.0 1.0 NA NA 1.0 1.0 6.8 1.0 1.0 1.0 -1.0
我正在处理这样的数据:
ID Count Report Rank
X-01 1 4.2 2
X-01 2 2.7 1
X-01 3 5.8 3
X-01 4 14 5
X-01 5 9.2 4
X-02 1 6.8 2
X-02 2 17 4
X-02 3 13 3
X-02 4 22.7 5
X-02 5 4 1
Count是指传感器被触发的时间,Report是数值,Rank是Report中的排名。
我对其中的 6 个变量感兴趣:
If Count = 1 and Rank = 1 then Report
If Count = 1 and Rank = 2 then Report
If Count > 1 and Rank = 1 or 2, then -1
If Count = 1 and Rank = 3:5, -Report
If Count >= 2 and Rank = 3:10, 1
If Rank > 5 (there are multiple rows to each ID), 0
我已经尝试了 if (x) {} else if () {} 等和 ifelse() 多个嵌套,但我收到了很多红色文本!
Larger object length is not a multiple of shorter object length
很频繁。
到目前为止,我找到的唯一解决方案是通过 'ifelse' 计算一列中的每一行,然后将新列中的行相加,这既耗时又不优雅。
有什么想法吗?
您可以编写一个函数来指定给定每个输入组合的输出。
f1 <- function(count, rank, report){
# in case of missing count or rank data:
if (is.na(count) | is.na(rank)) return(NA)
if (count==1 & rank %in% 1:2) return(report)
if (count > 1 & rank %in% 1:2) return(-1)
if (count==1 & rank %in% 3:5) return(-report)
if (count >= 2 & rank %in% 3:10) return(1)
if (rank > 5) return(0)
return(NA)
}
接下来您可以使用 mapply
将此功能应用到您的 data.frame。
mapply(f1, count=d$Count, rank=d$Rank, report=d$Report)
[1] 4.2 -1.0 1.0 1.0 1.0 6.8 1.0 1.0 1.0 -1.0
编辑: 我更新了函数,以便它 returns NA
如果一些输入变量是 NA
.
鉴于此数据集:
d <- read.table(text='ID Count Report Rank
X-01 1 4.2 2
X-01 2 2.7 1
X-01 3 5.8 3
X-01 NA 4 2
X-01 2 5.5 NA
X-01 4 14 5
X-01 5 9.2 4
X-02 1 6.8 2
X-02 2 17 4
X-02 3 13 3
X-02 4 22.7 5
X-02 5 4 1', header=T)
我得到这个输出:
mapply(f1, count=d$Count, rank=d$Rank, report=d$Report)
[1] 4.2 -1.0 1.0 NA NA 1.0 1.0 6.8 1.0 1.0 1.0 -1.0