这个问题有点让人费解,但我会尽力解释的。我有一个包含7个数字列(DIF1、DIF2、DIF3、DIF4、DIF5、DIF6、DIF7)的数据集,我想比较它们,看看哪一行的数字最低。
这样做之后,我需要创建一个列来填充其他7个字符列(D1、D2、D3、D4、D5、D6、D7)。我考虑使用ifelse语句来做这件事,如下所示:
eapv$DOSE <- ifelse(eapv$DIF1 < eapv$DIF2 & eapv$DIF3 & eapv$DIF4 & eapv$DIF5 & eapv$DIF6 & eapv$DIF7, eapv$D1,
ifelse(eapv$DIF2 < eapv$DIF1 & eapv$DIF3 & eapv$DIF4 & eapv$DIF5 & eapv$DIF6 & eapv$DIF7, eapv$D2,
ifelse(eapv$DIF3 < eapv$DIF1 & eapv$DIF2 & eapv$DIF4 & eapv$DIF5 & eapv$DIF6 & eapv$DIF7, eapv$D3,
ifelse(eapv$DIF4 < eapv$DIF1 & eapv$DIF2 & eapv$DIF3 & eapv$DIF5 & eapv$DIF6 & eapv$DIF7, eapv$D4,
ifelse(eapv$DIF5 < eapv$DIF1 & eapv$DIF2 & eapv$DIF3 & eapv$DIF4 & eapv$DIF5 & eapv$DIF7, eapv$D5,
ifelse(eapv$DIF6 < eapv$DIF1 & eapv$DIF2 & eapv$DIF3 & eapv$DIF4 & eapv$DIF5 & eapv$DIF7, eapv$D6,
ifelse(eapv$DIF7 < eapv$DIF1 & eapv$DIF2 & eapv$DIF3 & eapv$DIF4 & eapv$DIF5 & eapv$DIF6, eapv$D7, NA)))))))DIF列中的一些值是NA,但不能是0,因为其中一些值已经为0。
我可以提供可再生产的数据:
DIF1 <- c(2, 3, 4, 5, 6, 7, 8)
DIF2 <- c(3, 2, 2, 1, NA, NA, NA)
DIF3 <- c(NA, NA, NA, 1, O, NA)
D1 <- c("First", "Second", "First", "Third", "First", "Fourth", "Second")
D2 <- c("Second", "First", "First", "First", "Third", "First", "Second")
D3 <- c("Fourth", "Third", "Second", "First", "First", "First", "Second")
data <- as.data.frame(cbind(DIF1, DIF2, DIF3, D1, D2, D3))结果会是这样的:
DIF1 DIF2 DIF3 D1 D2 D3 DOSE
2 3 NA First Second Fourth First
3 2 NA Second First Third First
4 2 NA First First Second First
5 1 1 Third First First First
6 NA 0 First Third First First
7 NA NA Fourth First First Fourth
8 NA NA Second Second Second Second我怎么能这么做?
发布于 2022-04-07 14:03:13
您可以对列apply which.min行进行1:3,并添加3L以移动索引,并使用它对行进行子集。即选择D*。
apply(data, 1, \(x) x[which.min(x[1:3]) + 3L])
# [1] "First" "First" "First" "First" "First" "Fourth" "Second"注:R >= 4.1已使用。
更新
我们可以不用硬编码:
dif_cols <- match(c("DIF1", "DIF2", "DIF3"), names(data))
d_cols <- match(c("D1", "D2", "D3"), names(data))
apply(data, 1, \(x) x[d_cols][which.min(x[dif_cols])])
# [1] "First" "First" "First" "First" "First" "Fourth" "Second"数据:
data <- structure(list(DIF1 = c("2", "3", "4", "5", "6", "7", "8"), DIF2 = c("3",
"2", "2", "1", NA, NA, NA), DIF3 = c(NA, NA, NA, "1", "0", NA,
NA), D1 = c("First", "Second", "First", "Third", "First", "Fourth",
"Second"), D2 = c("Second", "First", "First", "First", "Third",
"First", "Second"), D3 = c("Fourth", "Third", "Second", "First",
"First", "First", "Second")), class = "data.frame", row.names = c(NA,
-7L))发布于 2022-04-07 14:32:57
你可以:
#Get column index of minimum values among numeric columns
idx <- apply(data[, sapply(data, is.numeric)], 1, which.min)
#Subset of character column
dataChar <- data[, sapply(data, is.character)]
data$DOSE <- mapply(function(x, y) dataChar[x, y], seq(nrow(dataChar)), idx)
[1] "First" "First" "First" "First" "First" "Fourth" "Second"https://stackoverflow.com/questions/71783552
复制相似问题