这是我的样本数据
> data.frame
a b c d
W_1_N NA NA NA NA
W_1_E 2 2 2 4
W_1_C 4 2 2 4
W_1_D NA NA NA NA
首先,我必须组合矩阵中的元素来获取它们的列名称,其中一个元素是4,另一个元素是同一行中的2个。
结果看起来像这样
W_1_E.1 d a
W_1_E.2 d b
W_1_E.3 d c
W_1_C.1 a b
W_1_C.2 a c
W_1_C.3 d b
W_1_C.4 d c
我只想要一对,其中一个元素是4,另一个元素是同一行中的2。 W_1_N和W_1_D只有NA因此被忽略了。 W_1_E出现在3行中,因为样本数据中有3对(4,2)行.W_1_C有4对。
这是代码:
lst=data.frame(df) %>%
rownames_to_column("rn") %>%
drop_na() %>%
gather(key, value, -rn) %>%
group_by(rn, value) %>%
summarise(l = list(unique(key))) %>%
split(.$rn)
pair=do.call("rbind", lapply(lst, function(x) expand.grid(x$l[[1]],
x$l[[2]])))
它完美无缺,但现在我有第二个data.frame:
a b c d
W_1_N 0 1 1 1
W_1_E 1 1 0 0
W_1_C 1 1 1 0
W_1_D 1 0 1 1
这是我的问题,我想只得到第二个data.frame中对的两个元素的值为1
的对。例如,我的结果W_1_E.1 d a
的第一对应该被删除,因为d
在第二个data.frame中的0
行中具有值W_1_E
。
输出应为:
W_1_C.1 a b
W_1_C.2 a c
d
在0
行中的值为W_1_E
,因此我的结果data.frame中包含W_1_E
的所有行都被删除了(所有的句子都在d
)。最后两行被删除,因为d
在第二个数据框的0
行中也是W_1_C
。
感谢您的帮助
答案 0 :(得分:0)
这是怎么回事?
x <- "N a b c d
W_1_N NA NA NA NA
W_1_E 2 2 2 4
W_1_C 4 2 2 4
W_1_D NA NA NA NA "
x1 <- read.table(text = x, header = TRUE)
x <- "N a b c d
W_1_N 0 1 1 1
W_1_E 1 1 0 0
W_1_C 1 1 1 0
W_1_D 1 0 1 1 "
x2 <- read.table(text = x, header = TRUE)
df <- merge(x1, x2, by="N")
df$a <- ifelse(df$a.y == 0,NA,df$a.x)
df$b <- ifelse(df$b.y == 0,NA,df$b.x)
df$c <- ifelse(df$c.y == 0,NA,df$c.x)
df$d <- ifelse(df$d.y == 0,NA,df$d.x)
df <- df[ , c(1,10:13)]
library(tidyr)
df_all <- df %>%
gather(key = key1, value, 2:5)
df2 <- df_all[!is.na(df_all$value) & df_all$value == 2,]
df4 <- df_all[!is.na(df_all$value) & df_all$value == 4,]
merge(df2[,1:2], df4[1:2], by = "N", all.x = FALSE, all.y = FALSE)