创建从 R 中的多个数据帧读取的条件
Creating a conditional that reads from multiple dataframes in R
我正在尝试清理用于社交网络分析的数据,作为编码的新手,我在编写复杂的条件时遇到了问题。
首先,我们有数据框 bookinfo
,其中感兴趣的 headers 是日期、接收者、bookID:
>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
然后,我们有数据框 rec
,其中 headers 感兴趣的是日期、发件人、收件人和 bookId:
>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
在数据框 rec
中,我想创建一个新列 Ties。条件如下:
平局 = 1 如果
- In
rec
: Sender, Receiver, and bookId 在同一行 AND
- 在
bookinfo
中:同一个接收者,相同的 bookId 在同一行中并且此处的日期晚于 rec
中引用行的日期
- 注意
rec
和bookinfo
不一定一致。而 Sender+Receiver+bookId 可能是 rec
中的第 3 行,Receiver+bookId 可能是 bookinfo
. 中的第 10 行
否则,并列=0。
直觉是,如果接收方在收到发送方对该书的推荐日期之后显示 activity 这本书,那么他们就打成平手。 (如果他们在日期之前显示activity,则与发件人无关)。
在此先感谢您的帮助和抽出时间!
我知道您那里有一个复杂的数据框,但请尝试提供可重现的示例 - 创建一些大致遵循您自己的虚拟数据。
此处您真正需要的代码是函数内的布尔索引。它使用列的整数位置,但您也可以使用列名来完成。
希望这对您有所帮助。
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' 中的所有数据行以查找所需的匹配项以进行记录。
一般来说,正如其他人会指出的那样,我们应该寻求通过 'apply' 类型的函数来向量化代码,而不是编写循环。但是,这是一个棘手的问题,我无法立即找到解决方案。
我正在尝试清理用于社交网络分析的数据,作为编码的新手,我在编写复杂的条件时遇到了问题。
首先,我们有数据框 bookinfo
,其中感兴趣的 headers 是日期、接收者、bookID:
>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
然后,我们有数据框 rec
,其中 headers 感兴趣的是日期、发件人、收件人和 bookId:
>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
在数据框 rec
中,我想创建一个新列 Ties。条件如下:
平局 = 1 如果
- In
rec
: Sender, Receiver, and bookId 在同一行 AND - 在
bookinfo
中:同一个接收者,相同的 bookId 在同一行中并且此处的日期晚于rec
中引用行的日期
- 注意
rec
和bookinfo
不一定一致。而 Sender+Receiver+bookId 可能是rec
中的第 3 行,Receiver+bookId 可能是bookinfo
. 中的第 10 行
否则,并列=0。
直觉是,如果接收方在收到发送方对该书的推荐日期之后显示 activity 这本书,那么他们就打成平手。 (如果他们在日期之前显示activity,则与发件人无关)。
在此先感谢您的帮助和抽出时间!
我知道您那里有一个复杂的数据框,但请尝试提供可重现的示例 - 创建一些大致遵循您自己的虚拟数据。
此处您真正需要的代码是函数内的布尔索引。它使用列的整数位置,但您也可以使用列名来完成。
希望这对您有所帮助。
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' 中的所有数据行以查找所需的匹配项以进行记录。
一般来说,正如其他人会指出的那样,我们应该寻求通过 'apply' 类型的函数来向量化代码,而不是编写循环。但是,这是一个棘手的问题,我无法立即找到解决方案。