好,所以我有以下data.frame:
v1<-c(456,234,981,776,112,998)
v2<-c(981,112,456,998,234,776)
df<- data.frame(v1,v2)
我想获得一个额外的变量,该变量具有对v1和v2值对的数字计数。诀窍是我需要按唯一的对编号,例如(456,981和981,456)应该编号为1。
所以结果将是这样的:
v1<-c(456,234,981,776,112,998)
v2<-c(981,112,456,998,234,776)
v3<-c(1,2,1,3,2,3)
df<- data.frame(v1,v2,v3)
答案 0 :(得分:2)
您可以按行排序并使用match
,即
v1 <- do.call(paste, data.frame(t(apply(df, 1, sort))))
match(v1, unique(v1))
#[1] 1 2 1 3 2 3
答案 1 :(得分:1)
使用dplyr怎么样?基本上,您将对每一行的列进行排序。不知道它是否会更有效率。显然,这要多得多。
library(dplyr)
df <- data.frame(v1,v2)
# Sort by v1 and v2 elements by row
df.new <- df %>%
mutate(z1 = pmin(v1,v2),
z2 = pmax(v1,v2))
# Build a distinct coding table
df.codes <- df.new %>%
distinct(z1, z2) %>%
mutate(v3 = 1:n())
# Join it back together
df.new %>%
left_join(df.codes, by = c("z1", "z2")) %>%
select(v1, v2, v3)