我有一个数据框,可以提供同一州提供的人的成对相关性。 我给出了一个关于我希望如何处理这些数据的小例子,但是现在我的实际数据集有1500万行用于成对相关和更多的附加列。
以下是示例数据:
>sample_data
Pair_1ID Pair_2ID CORR
1 2 0.12
1 3 0.23
2 1 0.12
2 3 0.75
3 1 0.23
3 2 0.75
我想生成没有重复的新数据帧,例如在第1行中,人1和2之间的相关性是0.12。第1行与第3行相同,它显示了2和1之间的相关性。由于它们具有相同的信息,我希望最终文件没有重复,我想要一个类似下面的文件:
>output
Pair_1ID Pair_2ID CORR
1 2 0.12
1 3 0.23
2 3 0.75
有人可以帮忙吗?独特的命令不适用于此,我不知道该怎么做。
答案 0 :(得分:10)
假设每个组合出现两次:
subset(sample_data , Pair_1ID <= Pair_2ID)
如果不是:
unique(transform(sample_data, Pair_1ID = pmin(Pair_1ID, Pair_2ID),
Pair_2ID = pmax(Pair_1ID, Pair_2ID)))
修改:关于最后一个,包括CORR
中的unique
因为可能的浮点问题而不是一个好主意。我也看到你提到你有更多的专栏。因此,最好将比较限制为两个ID:
relabeled <- transform(sample_data, Pair_1ID = pmin(Pair_1ID, Pair_2ID),
Pair_2ID = pmax(Pair_1ID, Pair_2ID))
subset(relabeled, !duplicated(cbind(Pair_1ID, Pair_2ID)))
答案 1 :(得分:0)
flodel的答案真的很棒。我只是想在没有查看实际值的情况下添加基于索引的另一种解决方案。它仅在所有组合都存在且数据框由第1列第1列和第2列第2列(如示例中)排序时有效。
maxVal <- max(sample_data$Pair_1ID)
shrtIdx <- logical(maxVal)
idx <- sapply(seq(maxVal - 1, 1), function(x) replace(shrtIdx, seq(x), TRUE))
sample_data[idx,]
# Pair_1ID Pair_2ID CORR
# 1 1 2 0.12
# 2 1 3 0.23
# 4 2 3 0.75