繁体   English   中英

根据r中的列值对数据框进行子设置

[英]subsetting dataframes based on column values in r

给定一个数据框,例如:

a <- c(1:3,4:6)
b <- c(2:4,3,2,1)
c <- cbind(a,b)

我想通过删除具有相似比较的行来对数据帧进行子集化(例如:row3:3,4与row4:4,3相同),并且只有其中之一。

a <- c(1:3,4:6)
b <- c(2:4,3,2,1)
d <- cbind(a,b)
e <- t(apply(d,1,function(x){x[order(x)]}))
d <- d[!duplicated(e),]

> d
     a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
[4,] 5 2
[5,] 6 1

假设d是您的矩阵,而不是c

e <- unique(apply(d,1,function(x) paste(sort(x),collapse="~")))
> t(sapply(strsplit(e,"~"),as.numeric))
     [,1] [,2]
[1,]    1    2
[2,]    2    3
[3,]    3    4
[4,]    2    5
[5,]    1    6

分解:

第一行

apply(d,1,function(x) ... )将d的每一行作为向量x传递给匿名函数,在此我将其称为...

函数体为paste(sort(x),collapse="~") ,对向量进行排序,然后将其转换为长度为1的向量,每个元素之间用~分隔。

因此, apply调用总体上将返回一个字符向量,其中每个元素以前都是矩阵的一行。

然后, unique保留唯一元素。 排序可确保做到这一点。

第二行

strsplit(e,"~")将我们的字符向量拆分回单独的形式。 在这种情况下,它是一个列表,其中每个元素都是组成每一行的数字的字符向量。

sapply(...,as.numeric)as.numeric() sapply(...,as.numeric)应用于列表的每个元素。 因此,我们将字符向量转换回数字向量。 由于s in sapply代表“简化”,因此它将以此创建矩阵。

但这是错误的方向(2x5而不是5x2)! t()将矩阵转置为原始形式。

在您的示例中,c不是data.frame,而是矩阵。 如其他所述,不应将c用作变量名。

在一行中,您可以执行以下操作:

a <- c(1:3,4:6)
b <- c(2:4,3,2,1)
cc <- cbind(a,b)
cc[!duplicated(t(apply(cc,1,sort))), ]
     a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
[4,] 5 2
[5,] 6 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM