【问题标题】:Combine of information based on two dataframes in R基于R中两个数据框的信息组合
【发布时间】:2017-06-07 10:44:02
【问题描述】:

这是我的示例数据

> 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 的W_1_E 行中具有0 的值。

输出应该是:

W_1_C.1  a  b
W_1_C.2  a  c

dW_1_E 行中具有值0,因此在我的结果data.frame 中所有带有W_1_E 的行都被消除(所有par 都带有d)。最后两行被删除,因为d 也是第二个数据帧中W_1_C 行中的0

感谢您的帮助

【问题讨论】:

  • 您的预期输出是什么?是第一个例子之后的那个吗
  • 我的预期输出是第一个示例之后的输出,但仅限于这对,其中对的两个元素的值都是 1。
  • @akrun 你知道怎么做吗?

标签: r dataframe


【解决方案1】:

怎么样?

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)

【讨论】:

  • 我应该先把我的data.frame改成文本?在哪里我用01 定义我的第二个data.frame?
  • 没有。如果你这样做str(df),你会看到我所有的值都是整数。
  • 它给了我第一个数据框的元素对。我的问题是消除其中一个元素的值为 0 的这对。
  • 在消除了一个元素为 0 的对后,您能否显示您期望得到的输出?
  • 你知道怎么做吗?
猜你喜欢
  • 2013-05-16
  • 1970-01-01
  • 2023-03-09
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
相关资源
最近更新 更多