我有一个像这样的data.frame -
set.seed(123)
df = data.frame(x=sample(0:1,10,replace=T),y=sample(0:1,10,replace=T),z=1:10)
> df
x y z
1 0 1 1
2 1 0 2
3 0 1 3
4 1 1 4
5 1 0 5
6 0 1 6
7 1 0 7
8 1 0 8
9 1 0 9
10 0 1 10
Run Code Online (Sandbox Code Playgroud)
我想根据前两列删除重复的行.预期产量 -
df[!duplicated(df[,1:2]),]
x y z
1 0 1 1
2 1 0 2
4 1 1 4
Run Code Online (Sandbox Code Playgroud)
我正在寻找使用dplyr包的解决方案.
我有一个包含100多列的数据框.cor()返回非常快,但告诉我太多,特别是因为大多数列不相关.我想它只是告诉我列对及其相关性,理想情况下是有序的.
如果没有意义,这是一个人为的例子:
df = data.frame(a=1:10,b=20:11*20:11,c=runif(10),d=runif(10),e=runif(10)*1:10)
z = cor(df)
Run Code Online (Sandbox Code Playgroud)
z看起来像这样:
a b c d e
a 1.0000000 -0.9966867 -0.38925240 -0.35142452 0.2594220
b -0.9966867 1.0000000 0.40266637 0.35896626 -0.2859906
c -0.3892524 0.4026664 1.00000000 0.03958307 0.1781210
d -0.3514245 0.3589663 0.03958307 1.00000000 -0.3901608
e 0.2594220 -0.2859906 0.17812098 -0.39016080 1.0000000
Run Code Online (Sandbox Code Playgroud)
我正在寻找的是一个能告诉我的功能:
a:b -0.9966867
b:c 0.4026664
d:e -0.39016080
a:c -0.3892524
b:d 0.3589663
a:d -0.3514245
b:e -0.2859906
a:e 0.2594220
c:e 0.17812098
c:d 0.03958307
Run Code Online (Sandbox Code Playgroud)
我有一个粗暴的方法来摆脱一些噪音:
z[abs(z)<0.5]=0
Run Code Online (Sandbox Code Playgroud)
然后扫描寻找非零值.但它远远低于上述所需的输出.
更新:根据收到的答案,以及一些试验和错误,这是我采用的解决方案:
z[lower.tri(z,diag=TRUE)]=NA #Prepare to drop duplicates and meaningless information
z=as.data.frame(as.table(z)) #Turn into …Run Code Online (Sandbox Code Playgroud)