3

我有一个数据框,其中包含几行这种格式的对

41,25
25,41
23,41
41,23

我只想要不同的对并且顺序无关紧要。因此,例如数据框应该看起来像这样

41,25
41,25
41,23
41,23

所以我可以数出 41 和 25 的组合出现了多少次。

所以我想遍历整个数据框并对每个字符串进行排序,以便首先出现最高值。(或最低值,没关系)。

希望对你有所帮助。我猜这很简单,但无法弄清楚。

谢谢

4

2 回答 2

3

如果d是你的data.frame并且这些对是一列中的字符串,那么

d[, 1] <- sapply(strsplit(d[, 1], ','), function(x) paste(sort(x), collapse=','))

如果这些对在两列之间拆分,例如第 1 列和第 2 列,则

d[, 1:2] <- t(apply(apply(d[, 1:2], 1, identity), 2, sort))
于 2013-05-22T15:16:04.057 回答
0

当看到@Matthew Plourde 的流畅编码时,这可能会令人尴尬,但我认为您不想删除重复的行,所以这是我想出的解决方案:

#Make some data
set.seed(1)
N <- 200
MIN <- 1
MAX <- 8
df <- data.frame(x=paste(round(runif(N, min=MIN, max=MAX)), round(runif(N, min=MIN, max=MAX)), sep=","))

#Split data into 2 components
require(plyr)
tmp <- ldply(strsplit(as.character(df$x), ","))
df$x1 <- as.numeric(tmp[,1])
df$x2 <- as.numeric(tmp[,2])
head(df)

#sort smaller of values to the left
tmp <- t(apply(df[,2:3], 1, sort))
df$x.sort <- apply(tmp, 1, paste, collapse=",")
head(df)

#sort df
ord <- order(df$x.sort)
df <- df[ord,]
head(df, 20)

结果是:

      x x1 x2 x.sort
167 1,1  1  1    1,1
92  1,2  1  2    1,2
27  1,3  1  3    1,3
71  3,1  3  1    1,3
28  4,1  4  1    1,4
47  1,4  1  4    1,4
55  1,4  1  4    1,4
67  4,1  4  1    1,4
81  4,1  4  1    1,4
116 1,4  1  4    1,4
133 1,4  1  4    1,4
152 5,1  5  1    1,5
10  1,6  1  6    1,6
85  6,1  6  1    1,6
99  7,1  7  1    1,7
109 7,1  7  1    1,7
5   2,2  2  2    2,2
12  2,2  2  2    2,2
22  2,2  2  2    2,2
56  2,2  2  2    2,2
于 2013-05-22T15:25:12.253 回答