我有一个像这样的数据框:
df <- data.frame(col1=c("A","B","C","D","E"),col2=c("B","A","D","C","F"),col3=c(5,3,1,6,2))
col1 col2 col3
A B 5
B A 3
C D 1
D C 6
E F 2
我想根据col1和col2检查col3中的值。如果col1中的字符串/值等于col2中的字符串/值,则比较col3中的值并使行具有更大的值。 结果应如下:
df1 <- data.frame(col1=c("A","D","E"),col2=c("B","C","F"),value=c(5,6,2))
col1 col2 col3
A B 5
D C 6
E F 2
目前,我使用循环来解决此问题。但是我有一个大数据。那么,有谁知道如何有效地解决这个问题?非常感谢!
答案 0 :(得分:1)
对col1
,col2
中的数据进行排序,然后在col3
中选择具有最大值的行:
library(dplyr)
df %>%
group_by(newcol1 = pmin(col1, col2), newcol2 = pmax(col1, col2)) %>%
slice(which.max(col3)) %>%
ungroup() %>%
select(names(df))
# A tibble: 3 x 3
# col1 col2 col3
# <chr> <chr> <dbl>
#1 A B 5
#2 D C 6
#3 E F 2
答案 1 :(得分:0)
我们可以使用data.table
方法
library(data.table)
i1 <- setDT(df)[, .I[which.max(col3)], .(pmin(col1, col2), pmax(col1, col2))]$V1
df[i1]
# col1 col2 col3
#1: A B 5
#2: D C 6
#3: E F 2
或使用base R
aggregate(col3 ~ ., cbind(as.data.frame(t(apply(df[1:2], 1, sort))),
df['col3']), max)