包含R中列的最小值的行

时间:2015-06-25 13:56:14

标签: r matrix

我在R中使用向量和矩阵。

在矩阵中,我想返回具有特定列的最小值的所有行(例如,第9列)。该列的值也可以是"Not Available"。我怎么能这样做?

要检查我尝试data <- data[data[,9] != "Not Available"]的不可用值,但它没有给我预期的结果。

例如 -

Code  Name     Number
1     India     2.3
2     America   3.5
3     China   Not Available
4     Europe    1.2
5    Japan      1.2

我想获取列Number的最小值的所有行。所需的输出是

    Code  Name     Number
     4    Europe    1.2
     5   Japan      1.2

不可用值必须忽略

2 个答案:

答案 0 :(得分:3)

通过在列中添加“非数字”元素,当我们使用read.csv/read.table读取数据时,该列将转换为“character”或“factor”类。如果我们使用stringsAsFactors=FALSE,列类将是'character',否则默认情况下它将是'factor'。

假设您使用stringsAsFactors=FALSE读取数据集,然后我们可以将列更改为{数字'as.numeric,非数字元素将被强制转换为NA

 df1$Number <- as.numeric(df1$Number)

如果列是'factor'类,我们可能需要as.numeric(as.character(df1$Number))。然后我们通过“数字”列的“min”值subset数据集。

 subset(df1, Number==min(Number, na.rm=TRUE))
 #    Code   Name Number
 #4    4 Europe    1.2
 #5    5  Japan    1.2

这也可以在不更改“数字”类的情况下完成(即将其保留为“字符”列,但不建议使用)

 subset(df1, Number== min( as.numeric(Number[Number!='Not Available'])))
 #   Code   Name Number
 #4    4 Europe    1.2
 #5    5  Japan    1.2

最好的选择是通过在na.strings中指定“不可用”来读取数据集,它将转换为NA

 df1 <- read.table('yourfile.txt', header=TRUE, na.strings='Not Available')

数据

 df1 <- structure(list(Code = 1:5, Name = c("India", "America", "China", 
 "Europe", "Japan"), Number = c("2.3", "3.5", "Not Available", 
 "1.2", "1.2")), .Names = c("Code", "Name", "Number"),
 class =   "data.frame", row.names = c(NA, -5L))

答案 1 :(得分:1)

要删除“不可用”的所有行,您将缺少逗号。 data <- data[data[,9] != "Not Available",]应该有用。

要确定哪一行具有最小值,请使用apply和which.min。例如,

> foo <- matrix(c(1,2,3,5,4,6,9,7,8), 3, 3)
> foo
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    4    7
[3,]    3    6    8
> apply(foo, 2, which.min)
[1] 1 2 2

如果要在决定哪个是最小行时忽略具有“不可用”的行,请将该列强制转换为数字。 “不可用”将变为NA,将由哪个.min。

丢弃 祝你好运!