【问题标题】:Using loop in functions在函数中使用循环
【发布时间】:2014-02-27 05:15:13
【问题描述】:

我有一个数据集,我想根据变量范围(时间)重复计算一些参数。所以我的数据集是这样的:

structure(list(A = c(25L, 25L, 25L, 25L, 25L, 25L), T = 56:61, 
    X = c(481.07, 487.04, 490.03, 499, 504.97, 507.96), Y = c(256.97, 
    256.97, 256.97, 256.97, 256.97, 256.97), V = c(4.482, 5.976, 
    7.47, 4.482, 5.976, 7.47), thetarad = c(0.164031585831919, 
    0.169139558949956, 0.171661200692621, 0.179083242584008, 
    0.183907246800473, 0.186289411097781), thetadeg = c(9.39831757286096, 
    9.69098287432395, 9.83546230358968, 10.2607139792383, 10.537109061132, 
    10.6735970214433), bin = structure(c(1L, 1L, 1L, 1L, 1L, 
    1L), .Label = c("binA", "binB", "binC", "outbin"), class = "factor")), .Names = c("A", 
"T", "X", "Y", "V", "thetarad", "thetadeg", "bin"), row.names = c(NA, 
6L), class = "data.frame")

这段代码非常适合计算我的参数:

NT <- data.table(st1binned [st1binned$T<31, ], key="bin")
alox1=NT[, list(ang=length(unique(thetadeg)), len=length(T), Vm=mean(V), T=c("30s")), 
         by=c("A", "bin")]

如果我愿意,我可以重复使用此代码,只需将我的数据子集更改为 st1binned 并将其绑定到我的数据集:

NT <- data.table(st1binned [st1binned$T>30 & T<61,  ], key="bin")
alox1=rbind(alox1, NT[, list(ang=length(unique(thetadeg)), len=length(T), Vm=mean(V), T=c("60s")), 
         by=c("A", "bin")])

但是有没有办法循环这些函数,我可以说它应该考虑每 30 秒的数据并更改 T 变量?

编辑:

生成的数据集应如下所示:

structure(list(A = c(38L, 45L, 115L, 118L, 121L, 692L), bin = structure(c(1L, 
1L, 1L, 1L, 1L, 1L), .Label = c("binA", "binB", "binC", "outbin"
), class = "factor"), ang = c(2L, 7L, 4L, 4L, 11L, 1L), len = c(30L, 
30L, 24L, 23L, 11L, 30L), Vm = c(0.3984, 1.07771666666667, 0.465545833333333, 
0.760526086956522, 4.27607272727273, 0), T = c("30s", "30s", 
"30s", "30s", "30s", "30s")), .Names = c("A", "bin", "ang", "len", 
"Vm", "T"), class = c("data.table", "data.frame"), row.names = c(NA, 
-6L), .internal.selfref = <pointer: 0x0000000000170788>)

【问题讨论】:

  • 看看cut()s 的帮助。我没用过data.table,不知道有没有用。

标签: r loops dataset


【解决方案1】:

我认为您希望您的数据以 30 秒为增量进行分箱。如果这就是您想要的,您可以使用cut 来实现。为了演示,我必须创建一些间隔超过 30 秒的数据。我刚刚将您的数据框复制了三次,并为每个副本添加了 30 秒的增量。结果如下:

st1binned2$bin <- cut(st1binned2$T, rep(1:6 * 30), include.lowest=T)
NT <- data.table(st1binned2, key="bin")
NT[, list(ang=length(unique(thetadeg)), len=length(T), Vm=mean(V), T=paste(range(T), collapse="-")), 
         by=c("A", "bin")]
#     A       bin ang len     Vm       T
# 1: 25   [30,60]   5   5 5.6772   56-60
# 2: 25   (60,90]   6   6 5.9760   61-90
# 3: 25  (90,120]   6   6 5.9760  91-120
# 4: 25 (120,150]   6   6 5.9760 121-150
# 5: 25 (150,180]   1   1 7.4700 151-151

这就是我创建数据的方式:

st1binned2 <- do.call(rbind, replicate(4, st1binned, simplify=F))
st1binned2$T <- st1binned2$T + rep(0:3 * 30, each=nrow(df))

EDIT,修改标签,示例:

bins <- rep(1:6 * 30)
st1binned2$bin <- cut(
  st1binned2$T, bins, include.lowest=T,
  labels=paste(head(bins, -1L), tail(bins, -1L), sep="-"), 
)

【讨论】:

  • 是的,你是对的,我想将我的数据分成 30 秒的增量。但是,我还有一个名为 bin 的变量,因此我将 st1binned2$bin 更改为 st1binned2$time。因为我也希望时间成为一个变量,所以我将你的脚本编辑为NT[, list(ang=length(unique(thetadeg)), len=length(T), Vm=mean(V), time=time), by=c("A", "bin")]。但是,有这个括号和括号准时(也可以在您的答案中看到)。知道如何删除它吗?谢谢@BrodieG
  • @Kaye11,您可以使用 cutlabels 参数来制作自己的标签,请参阅上面的更新。
  • 我刚刚观察到一个问题,结果数据集应该只有一个唯一的 A(因为我使用了一些函数来计算一些参数,但现在它显示了所有 A,即对于您上面的答案,它显示 5 个 25 的)。很抱歉没有早点指出这一点!
猜你喜欢
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 2022-10-21
  • 2013-10-16
  • 2013-12-28
  • 2013-11-23
  • 2014-06-19
  • 2021-06-01
相关资源
最近更新 更多