如果问题令人困惑,我很抱歉,我找不到更好的表达方式。
创建推文时,我有一个包含推文,用户ID和日期的数据集。
userid tweet date
1132622143 bla bla 2014-04-23
1132622143 bla bla 2014-05-23
1132622143 ... ...
1132622143
1132622145
我想制作此数据集的一个子集,其中包含最近在Twitter上发布内容的用户的数据,例如5月或更晚,因此对于至少有一条推文的用户,其中日期> 2014-05-01(我希望在我的新数据集中为这些活跃用户提供所有最近和旧的推文。)
我想我需要创建一个类似这样的函数:
for each distinct userid
find all rows with same userid value and put them in a list
for each row in a list
if there exists a row where date>2014-05-01
select all rows for this userid
我不确定这是否是正确的逻辑,如果是,那么如何实际编程。我将非常感谢你的帮助。
答案 0 :(得分:1)
ave
可以在这里使用。
以下是您的问题的概括,您可以希望扩展到您的实际数据。
首先,一些样本数据。我假设您知道如何将“日期”变量转换为实际的时间/日期变量。
mydf <- data.frame(
id = c(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4),
text = c("a", "b", "c", "a", "b", "c", "d", "e", "a", "b", "c", "a"),
time = c(1, 1, 2, 2, 3, 4, 4, 5, 3, 5, 5, 1)
)
使用ave
,您可以按组创建逻辑向量。在这里,我们检查在每组“id”中是否有任何“时间”大于或等于4。如果有,则为“id”的所有行返回TRUE
。
该信息可以直接用于提取那些相关的行。
as.logical(with(mydf, ave(time, id, FUN = function(x) any(x > 4))))
# [1] FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
mydf[as.logical(with(mydf, ave(time, id, FUN = function(x) any(x > 4)))), ]
# id text time
# 4 2 a 2
# 5 2 b 3
# 6 2 c 4
# 7 2 d 4
# 8 2 e 5
# 9 3 a 3
# 10 3 b 5
# 11 3 c 5