首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何比较7个数字列,得到它们之间的最低数字,并从R中的字符变量中插入值?

如何比较7个数字列,得到它们之间的最低数字,并从R中的字符变量中插入值?
EN

Stack Overflow用户
提问于 2022-04-07 13:57:51
回答 2查看 28关注 0票数 2

这个问题有点让人费解,但我会尽力解释的。我有一个包含7个数字列(DIF1、DIF2、DIF3、DIF4、DIF5、DIF6、DIF7)的数据集,我想比较它们,看看哪一行的数字最低。

这样做之后,我需要创建一个列来填充其他7个字符列(D1、D2、D3、D4、D5、D6、D7)。我考虑使用ifelse语句来做这件事,如下所示:

代码语言:javascript
复制
 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。

我可以提供可再生产的数据:

代码语言:javascript
复制
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))

结果会是这样的:

代码语言:javascript
复制
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

我怎么能这么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-07 14:03:13

您可以对列apply which.min行进行1:3,并添加3L以移动索引,并使用它对行进行子集。即选择D*

代码语言:javascript
复制
apply(data, 1, \(x) x[which.min(x[1:3]) + 3L])
# [1] "First"  "First"  "First"  "First"  "First"  "Fourth" "Second"

注:R >= 4.1已使用。

更新

我们可以不用硬编码:

代码语言:javascript
复制
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"

数据:

代码语言:javascript
复制
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))
票数 2
EN

Stack Overflow用户

发布于 2022-04-07 14:32:57

你可以:

代码语言:javascript
复制
#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"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71783552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档