我的数据框(df):
ID1 | ID2 | V1 | V2 | V3
A | B | var1 | foo | 1
C | D | var2 | bar | 2
E | F | var3 | foo | 3
G | F | var3 | foo | 3
H | I | var4 | zap | 2
...
ID1和ID2包含重叠的值,因为它是上矩阵三角形的长格式版本,其中删除了相同的比较符号(例如A,A),并添加了一些其他元数据(V1,V2,V3)。
以上内容必须按V1,V2和V3分组,最终输出将是组成每个组的ID列表(ID1和ID2包含重叠的变量)(每个列表是一个单独的文件)。 / p>
到目前为止,我已经对变量进行了分组,但停留在如何遍历dplyr的每个组并为每个组获取值的工作上。
我想到的伪代码如下:
# Group
cluster <- df %>% group_by(V1,V2,V3)
[?] # loop through each group in cluster
[?] # get group values as x, y and z
# Get IDs into lists and merge
ID1 <- df %>% filter(V1 == x, V2 ==y, V3 == z) %>%
pull(ID1)
ID2 <- df %>% filter(V1 == x, V2 ==y, V3 == z) %>%
pull(ID2)
merged <- c(ID1,ID2)
merged_unique <- unique(unlist(merged))
# Print out to file
fileConn <- file(paste(X ,Y, Z,"txt", sep="."))
writeLines(merged_unique, fileConn)
close(fileConn)
我希望我的最终输出是:
A
B
C
D
E
F
G
H
I
感谢您的帮助。
答案 0 :(得分:1)
我不确定预期的输出。希望下面的代码能有所帮助
lapply(
split(
df[c("ID1", "ID2")],
with(df, do.call(paste, list(V1, V2, V3)))
),
function(v) unique(unlist(v))
)
给出
$`var1 foo 1`
[1] "A" "B"
$`var2 bar 2`
[1] "C" "D"
$`var3 foo 3`
[1] "E" "G" "F"
$`var4 zap 2`
[1] "H" "I"
如果要将所有组保存到不同的*.txt
文件中,可以尝试以下代码
lst <- lapply(
split(
df[c("ID1", "ID2")],
with(df, do.call(paste, list(V1, V2, V3,sep = "_")))
),
function(v) unique(unlist(v))
)
sapply(seq_along(lst),function(k) writeLines(lst[[k]],paste0(names(lst[k]),".txt")))
答案 1 :(得分:1)
生成“数据”:
val <- df$B[match('b', df$A)]
集群数据并获得唯一集群:
df <- data.frame("ID1" = c("A","B","C","E","G","H"), "ID2" = c("B","B","D","Fe","Fe","I"), "V1" = c("var1","var1","var2","var3","var3","var4"),"V2" = c("foo","foo","bar","foo","foo","zed"), "V3" = c(1,1,2,3,3,2))
循环浏览,假设仅两个ID列和3个要素列,然后将每个结果打印到一个新文件中:
library(dplyr)
df_clust <- df %>% group_by(V1,V2,V3)
df_tally <- df_clust %>% tally()