从多个选定列创建新列(结果为最小值或 NA)
create new column (with outcome min or NA) from multiple selected columns
我的数据有很多列和主题,但为了更简单地说明,假设我有 7 个主题,其中 3 个 variables/columns 称为 x1、x2 和 x3(值范围从 1 到 3 和 NA)。在我想要的分析中,重要的是我实际上调用了我想使用的列(因为我不能只在我的分析中使用整个数据框,因为那里有更多 variables/columns)
>data <- data.frame(‘id’=c(1,2,3,4,5,6,7), ‘x1’=c(1,2,2,NA,3,3,1), ‘x2’=c(NA,3,1,NA,2,3,2), ‘x3’=c(NA,2,NA,NA,3,NA,1)
id x1 x2 x3
1 1 NA NA
2 2 3 2
3 2 1 NA
4 NA NA NA
5 3 2 NA
6 3 3 NA
7 1 2 1
x1 x2和x3的class为数值。
除此之外,我想创建一个名为“x4”的 variable/column :
- 给我最少的行 x1、x2 和 x3。
-如果x1,x2,x3一行有NA,则NA忽略。
-如果它们都是 NA,我希望结果是 NA。 (不是 Inf,这是它现在对我的代码所做的)
-如果有两个最小的数字相同,则只显示这两个中的任何一个。所以像这样:
>data <- data.frame(‘id’=c(1,2,3,4,5,6,7), ‘x1’=c(1,2,2,NA,3,3,1), ‘x2’=c(NA,3,1,NA,2,3,2), ‘x3’=c(NA,2,NA,NA,3,NA,1), ‘x4’=c(1,2,1,NA,2,3,1)
id x1 x2 x3 x4
1 1 NA NA 1
2 2 3 2 2
3 2 1 NA 1
4 NA NA NA NA
5 3 2 NA 2
6 3 3 NA 3
7 1 2 1 1
我设法找到了一个非常相似的问题,我基本上可以解决它:
data$x4 <- apply(data[ c("x1","x2","x3")],1, FUN=min, na.rm = TRUE )
我现在遇到的问题是,在所有 NA 的情况下(所以 ID 号为 4),我的结果不是 NA,而是 'Inf'。
问题 1:我怎样才能让它变成 NA 而不是 Inf?之后我当然可以这样做:
is.na(数据$x4) <- 应用(数据$x4, is.infinite)
但我想知道是否有一个很好的方法可以在 with/inside 之前的代码中做到这一点?
此外,与其使用 sapply 和内部 FUNction min,我还想尝试以如下方式使用代码:问题 2: 正在使用下面的其他代码可能吗?
data$x4 <- min(data[ c("x1","x2","x3")],1 , na.rm = TRUE)
为此 x4 每次都得到结果“1”。我猜它只是显示了整列的最低数字 (1)?我不明白为什么。我已经在使用“,1”但没有帮助。
我希望有人能帮助我(r 和 Whosebug 新手),谢谢!
您可以在调用 min
之前测试是否所有 NA
,例如:
apply(data[, c("x1","x2","x3")], 1, function(x)
if(all(is.na(x))) NA else min(x, na.rm=TRUE))
#[1] 1 2 1 NA 2 3 1
min(data[, c("x1","x2","x3")],1 , na.rm = TRUE)
给出 1
和 data[, c("x1","x2","x3")]
中的最小值。
您正在寻找 pmin
函数,该函数 returns 输入值的(常规或平行)最小值。以下是使用 pmin 的两种方法:
df$minIget <- do.call(pmin, c(df[,-1], na.rm = TRUE)) # Approch1: using do.call
df %>% rowwise() %>% mutate(minIget = pmin(x1, x2,x3,na.rm = T))# Approch2: using tidyverse.
输出:
A tibble: 7 x 5
# Rowwise:
id x1 x2 x3 minIget
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 NA NA 1
2 2 2 3 2 2
3 3 2 1 NA 1
4 4 NA NA NA NA
5 5 3 2 3 2
6 6 3 3 NA 3
7 7 1 2 1 1
我的数据有很多列和主题,但为了更简单地说明,假设我有 7 个主题,其中 3 个 variables/columns 称为 x1、x2 和 x3(值范围从 1 到 3 和 NA)。在我想要的分析中,重要的是我实际上调用了我想使用的列(因为我不能只在我的分析中使用整个数据框,因为那里有更多 variables/columns)
>data <- data.frame(‘id’=c(1,2,3,4,5,6,7), ‘x1’=c(1,2,2,NA,3,3,1), ‘x2’=c(NA,3,1,NA,2,3,2), ‘x3’=c(NA,2,NA,NA,3,NA,1)
id x1 x2 x3
1 1 NA NA
2 2 3 2
3 2 1 NA
4 NA NA NA
5 3 2 NA
6 3 3 NA
7 1 2 1
x1 x2和x3的class为数值。 除此之外,我想创建一个名为“x4”的 variable/column : - 给我最少的行 x1、x2 和 x3。
-如果x1,x2,x3一行有NA,则NA忽略。
-如果它们都是 NA,我希望结果是 NA。 (不是 Inf,这是它现在对我的代码所做的)
-如果有两个最小的数字相同,则只显示这两个中的任何一个。所以像这样:
>data <- data.frame(‘id’=c(1,2,3,4,5,6,7), ‘x1’=c(1,2,2,NA,3,3,1), ‘x2’=c(NA,3,1,NA,2,3,2), ‘x3’=c(NA,2,NA,NA,3,NA,1), ‘x4’=c(1,2,1,NA,2,3,1)
id x1 x2 x3 x4
1 1 NA NA 1
2 2 3 2 2
3 2 1 NA 1
4 NA NA NA NA
5 3 2 NA 2
6 3 3 NA 3
7 1 2 1 1
我设法找到了一个非常相似的问题,我基本上可以解决它:
data$x4 <- apply(data[ c("x1","x2","x3")],1, FUN=min, na.rm = TRUE )
我现在遇到的问题是,在所有 NA 的情况下(所以 ID 号为 4),我的结果不是 NA,而是 'Inf'。
问题 1:我怎样才能让它变成 NA 而不是 Inf?之后我当然可以这样做:
is.na(数据$x4) <- 应用(数据$x4, is.infinite)
但我想知道是否有一个很好的方法可以在 with/inside 之前的代码中做到这一点?
此外,与其使用 sapply 和内部 FUNction min,我还想尝试以如下方式使用代码:问题 2: 正在使用下面的其他代码可能吗?
data$x4 <- min(data[ c("x1","x2","x3")],1 , na.rm = TRUE)
为此 x4 每次都得到结果“1”。我猜它只是显示了整列的最低数字 (1)?我不明白为什么。我已经在使用“,1”但没有帮助。
我希望有人能帮助我(r 和 Whosebug 新手),谢谢!
您可以在调用 min
之前测试是否所有 NA
,例如:
apply(data[, c("x1","x2","x3")], 1, function(x)
if(all(is.na(x))) NA else min(x, na.rm=TRUE))
#[1] 1 2 1 NA 2 3 1
min(data[, c("x1","x2","x3")],1 , na.rm = TRUE)
给出 1
和 data[, c("x1","x2","x3")]
中的最小值。
您正在寻找 pmin
函数,该函数 returns 输入值的(常规或平行)最小值。以下是使用 pmin 的两种方法:
df$minIget <- do.call(pmin, c(df[,-1], na.rm = TRUE)) # Approch1: using do.call
df %>% rowwise() %>% mutate(minIget = pmin(x1, x2,x3,na.rm = T))# Approch2: using tidyverse.
输出:
A tibble: 7 x 5
# Rowwise:
id x1 x2 x3 minIget
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 NA NA 1
2 2 2 3 2 2
3 3 2 1 NA 1
4 4 NA NA NA NA
5 5 3 2 3 2
6 6 3 3 NA 3
7 7 1 2 1 1