从多个选定的列中创建新列(结果为min或NA)

问题描述 投票:1回答:2

我的数据有很多列和主题,但为简单起见,可以说我有7个主题,其中3个变量/列分别为x1,x2和x3(值的范围为1到3和NA)。在我想要的分析中,我实际上要调用要使用的列很重要(因为我不能仅在分析中使用整个数据框,因为那里有更多的变量/列)

>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的类别是数字。除此之外,我想创建一个名为“ x4”的变量/列,该变量/列是:-给我最少的行x1,x2和x3。

-如果在x1,x2,x3的一行中有一个NA,则应忽略该NA。

-如果它们都是ALL 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

我设法找到了一个非常相似的问题,并且我基本上可以使它起作用:min for each row with dataframe in R

data $ x4

我现在的问题是,对于所有NA(id为4),我的结果不是NA,而是'Inf'。

问题1:如何使其成为NA而不是Inf?我当然可以这样做:

is.na(data $ x4)

但是我想知道是否有一种不错的方法可以在之前的代码中/之前完成此操作?

而且,而不是随后使用sapply和内部的FUNction min,我还想尝试使其与代码以如下方式一起使用:问题2:正在下面使用以下其他代码吗?

data $ x4

为此x4每次都会得到结果'1'。我猜它只显示整个列中的最低数字(1)?我不明白为什么。我已经在使用',1'但没有帮助。

我希望有人可以帮助我(谢谢和stackoverflow新手),谢谢!

r apply min sapply inf
2个回答
0
投票

您可以像这样呼叫NA来测试是否全部都是min:>

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)为您提供1data[, c("x1","x2","x3")]的最小值。


0
投票

您正在寻找pmin函数,该函数返回输入值的(常规或并行)最大值和最小值。下面是两种使用pmin的方法:

© www.soinside.com 2019 - 2024. All rights reserved.