基于R中的两个数据帧的信息组合

时间:2017-06-07 10:44:02

标签: r dataframe

这是我的样本数据

> 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

d0行中的值为W_1_E,因此我的结果data.frame中包含W_1_E的所有行都被删除了(所有的句子都在d )。最后两行被删除,因为d在第二个数据框的0行中也是W_1_C

感谢您的帮助

1 个答案:

答案 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)