首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建从R中的多个数据读取的条件

创建从R中的多个数据读取的条件
EN

Stack Overflow用户
提问于 2018-04-29 17:20:36
回答 1查看 54关注 0票数 0

我正试图清理用于社交网络分析的数据,而作为编码新手,我在编写复杂的条件方面遇到了困难。首先,我们有dataframe bookinfo,其中感兴趣的头是日期、接收者、bookID:

代码语言:javascript
复制
>head(bookinfo)
        date                             receiver          bookId readingStatus
1 2017-04-21 03cff9d7-5712-410c-a4bf-f04ceede644b asin:0062228013  ALREADY_READ
2 2017-04-18 03cff9d7-5712-410c-a4bf-f04ceede644b asin:1442449616  ALREADY_READ
3 2017-04-24 03cff9d7-5712-410c-a4bf-f04ceede644b asin:0545851904  ALREADY_READ
4 2017-04-18 03cff9d7-5712-410c-a4bf-f04ceede644b asin:0545384176  ALREADY_READ
5 2017-06-02 03cff9d7-5712-410c-a4bf-f04ceede644b asin:0763643491  ALREADY_READ
6 2017-04-24 03cff9d7-5712-410c-a4bf-f04ceede644b asin:0545851890  ALREADY_READ

然后,我们得到了dataframe rec,其中感兴趣的头是日期、发件人、接收方和bookId:

代码语言:javascript
复制
>head(rec)
     date                               sender                             receiver       messageType          bookId
1 4/21/17 7a28156e-950e-47b7-a4aa-241fa9cfcf1a f8b027a3-89eb-475a-83e0-eb94e24eaab4 RECOMMENDS_A_BOOK asin:0986444138
2 4/21/17 fb4eefd3-03e9-40c3-bc9e-af85ea88d827 f8b027a3-89eb-475a-83e0-eb94e24eaab4 RECOMMENDS_A_BOOK asin:1434297314
3 4/21/17 dc319e95-0e3e-461e-b02c-abab4414c741 f8b027a3-89eb-475a-83e0-eb94e24eaab4 RECOMMENDS_A_BOOK asin:1484746694
4 4/18/17 118c57b6-e946-453f-88b2-6ae1282e62ab f8b027a3-89eb-475a-83e0-eb94e24eaab4 RECOMMENDS_A_BOOK asin:1514241587
5 4/21/17 dd0de21d-889d-4bf1-9ebb-af50b6660815 f8b027a3-89eb-475a-83e0-eb94e24eaab4 RECOMMENDS_A_BOOK asin:0986444138
6 4/21/17 f85d06ea-d534-42de-a714-6dc6358d1e29 f8b027a3-89eb-475a-83e0-eb94e24eaab4 RECOMMENDS_A_BOOK asin:1484746694

在dataframe rec中,我想创建一个新的列绑定。条件如下:

Tie =1

  • rec中:发送方、接收方和bookId位于同一行,并且
  • bookinfo中:相同的接收方,相同的bookId位于同一行,此处的日期比rec中的被引用行的日期晚
  • 注意,recbookinfo不一定是一致的。而Sender+Receiver+bookId在rec中可能是第3行,而Receiver+bookId在bookinfo中可能是第10行。

否则,Tie=0。

直觉是,如果接收者在收到“发件人”推荐书的日期之后显示出与该书有关的活动,那么他们就有了平局。(如果他们在日期之前有显示活动,这与发件人无关)。

提前感谢您的帮助和时间!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-29 22:23:51

我知道你有一个复杂的数据框架,但请尝试提供可重复的例子--创建一些大致遵循自己的虚拟数据。

您真正想要的代码是函数内部的布尔索引。它处理的是列的整数位置,但也可以使用列名。

希望这能有所帮助。

代码语言:javascript
复制
options(stringsAsFactors = FALSE)
bookinfo <- data.frame(date = as.Date(c('01-08-2010', '01-08-2010', '01-08-2011', '01-09-2011', '01-08-2012'), format = '%d-%m-%Y'), Sender = c('a', 'b', 'c', 'd', 'e'), Receiver = c(1, 2, 3, 4, 5), bookId = as.character(c('Dickens', 'Austen', 'Dickens', 'Austen', 'Shakespeare'))) 
rec <- data.frame(date = as.Date(c('01-08-2016', '01-08-2004', '01-08-2014', '01-07-2011', '01-08-2015'), format = '%d-%m-%Y'), Sender = c('a', 'b', 'c', 'd', 'e'), Receiver = c(1, 2, 3, 4, 5), bookId = as.character(c('Dickens', 'Austen', 'Dickens', 'Austen', 'Shakespeare'))))

bookinfo[, 1] <- as.numeric(bookinfo[, 1])
rec[, 1] <- as.numeric(rec[, 1])

booked <- function (x, y) {
  if ((x[2] == y[2] && x[3] == y[3] && x[4] == y[4] && x[1] < y[1]) == TRUE) {
    result <- 1
  } else {
    result <- 0
  }

  return(result)
}

rec['tie'] <- ''

for (i in 1:nrow(rec)) {
  for (j in 1:nrow(bookinfo)) {
    if (booked(rec[i, ], bookinfo[j, ]) == 1) {
      rec[i, 'tie'] <- 1
      }
  }
}

编辑

我已经更新了代码,所以现在我将扫描所有在'bookinfo‘中的数据行,以获得所需的匹配来rec。

通常,正如其他人所指出的,我们应该通过“应用”类型的函数而不是编写循环来将代码向量化。然而,这是一个棘手的问题,我无法立即找到解决办法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50089335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档