gpt4 book ai didi

r - 确定某项在变量中的出现次数

转载 作者:行者123 更新时间:2023-12-04 09:33:25 25 4
gpt4 key购买 nike

背景

现在,我有一个形状如下的数据框:

example = structure(list(sid = c(39, 40, 41, 42, 42, 43, 43, 44, 45, 45, 
46, 46, 47, 48, 49, 49, 50, 51, 52, 52, 53), monthday = c("42",
"44", "46", "410", "428", "423", "49", "411", "416", "430", "418",
"426", "419", "420", "420", "53", "421", "424", "425", "53",
"511")), .Names = c("sid", "monthday"), row.names = c(301L, 300L,
298L, 296L, 282L, 288L, 297L, 295L, 294L, 281L, 293L, 285L, 292L,
291L, 290L, 278L, 289L, 287L, 286L, 279L, 270L), class = "data.frame")

换句话说,它很高:
sid   monthday  
39 42
40 44
41 46
42 410
42 428
43 423
43 49

最后,我想把它变成一个宽格式:
sid   monthday1  monthday2
39 42 NA
40 44 NA
41 46 NA
42 410 428
43 423 49

等等

我一直在尝试使用 reshape 和 reshape2 包以及聚合,例如:
library(reshape2)
temp = melt(example,id.vars=c("sid"))
data.wide <- dcast(temp, sid ~ variable, value.var="value")

但不能让我的大脑围绕它。我突然想到,如果我能确定每个 sid 的出现,我就可以解决我的问题。

直接问题

那么如何取上面的高数据 sid 列我创建了一个新变量来指示每个 sid 的出现:
sid   occur 
39 1
40 1
41 1
42 1
42 2
43 1
43 2
occur变量表示 sid 值 39、40 和 41 仅出现一次,而 42 和 43 具有第一个和第二个实例。如果我只有两个实例,我可以使用duplicated() 并将其转换为数字,但是可以推广到任意数量实例的解决方案是什么?

最佳答案

您可以使用 ave生成您的“时间”:

example$time <- ave(example$sid, example$sid, FUN = seq_along)
head(example)
# sid monthday time
# 301 39 42 1
# 300 40 44 1
# 298 41 46 1
# 296 42 410 1
# 282 42 428 2
# 288 43 423 1
reshape(example, direction = "wide", idvar="sid", timevar="time")
# sid monthday.1 monthday.2
# 301 39 42 <NA>
# 300 40 44 <NA>
# 298 41 46 <NA>
# 296 42 410 428
# 288 43 423 49
# 295 44 411 <NA>
# 294 45 416 430
# 293 46 418 426
# 292 47 419 <NA>
# 291 48 420 <NA>
# 290 49 420 53
# 289 50 421 <NA>
# 287 51 424 <NA>
# 286 52 425 53
# 270 53 511 <NA>

或者,使用 dcast添加时间变量后来自“reshape2”:
dcast(example, sid ~ time, value.var="monthday")

关于r - 确定某项在变量中的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13831496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com