【问题标题】:How to create a new ordinal variable according to other variables?如何根据其他变量创建一个新的序数变量?
【发布时间】:2013-04-28 16:52:42
【问题描述】:

向社区的所有成员致敬。 这个问题可能与我之前问过的另一个问题相同,因此可能是重复的,但请求输出肯定与上一个问题不同。

我有以下数据库:

ID1=rep((1:1),20)
ID2=rep((2:2),20)
ID3=rep((3:3),20)
ID<-c(ID1,ID2,ID3)
DATE1=rep("2013-1-1",10)
DATE2=rep("2013-1-2",10)
DATE=c(DATE1,DATE2)
IN<-data.frame(ID,DATE=rep(DATE,3))

我想创建一个新变量,可以确定每个 id 记录了多少突发(突发定义为每天的一个观察周期),如下所示:

IN$BURSTTRUE<-rep(c(rep(1,10),rep(2,10)),3)

直到现在我已经尝试过这个解决方案(但不幸的是它不起作用,因为它正确识别每个突发,但不是根据每个 id)。

IN$BURST<-with(IN,as.numeric(interaction(IN$ID,IN$DATE,lex.order=TRUE)))

我认为ave 函数可能有助于解决此任务:我尝试了几种组合,但都没有奏效,因此我将解决方案报告为更接近请求输出。 一如既往,任何建议都非常感谢!

【问题讨论】:

  • as.data.frame(table(IN$ID, IN$DATE)) ??
  • @Arun 我认为您的答案是正确的。为什么要删除?
  • 嗨@Arun,我不想计算有多少条记录。我想确定每个 ID 有多少突发,就像在提供的输出中一样。
  • @stefano,我已取消删除我的答案。请检查这是否是您需要的。
  • +1 可重现示例,显示所需输出。

标签: r variables conditional-statements sequences


【解决方案1】:

首先使用参数stringsAsFactors=FALSE 创建您的data.frame IN,如下所示:

IN <- data.frame(ID,DATE=rep(DATE,3), stringsAsFactors=FALSE)

然后使用ave:

IN <- within(IN, { bla <- ave(DATE, ID, FUN=function(x) as.numeric(factor(x)))})

如果您想要 aggregation(如 simon 的回答),也可以使用 ave 来完成:

unique(within(IN, { bla <- ave(DATE, list(ID,DATE), FUN=length)}))

或者,使用table,如 cmets 下所示:

as.data.frame(table(IN$ID, IN$DATE))

【讨论】:

  • 再一次,“ave”完成了任务。现在我知道 ave 可以同时加权不同的因素!!!谢谢@Arun,绝对“ave”是一个很棒的功能!!!
  • ave 是最被低估的函数之一恕我直言。这很棒!感谢@AnandaMahto,基函数之神聚合、调整和重塑。
【解决方案2】:

我想plyr 中的ddply 是一种简单的方法来聚合你想要的东西:

require(plyr)
ddply( IN , .(DATE,ID) , nrow )
#     DATE ID V1
#1 2013-1-1  1 10
#2 2013-1-1  2 10
#3 2013-1-1  3 10
#4 2013-1-2  1 10
#5 2013-1-2  2 10
#6 2013-1-2  3 10

@Arun 对使用 ddply 完成此任务的(正确)方式的建议:

ddply(IN, .(ID) , mutate, bla = as.numeric(factor(DATE)))

【讨论】:

  • 嗨@Simon0101,这是一个很好的建议,但输出与我的需要相去甚远。我稍微修改了您的建议,例如:“ddply( IN , .(ID,DATE) , interaction)”,但现在有必要将所有新变量放在一列中......有什么想法吗?
  • @stefano 是的,我想我误解了你想要的。 Arun 有一个解决方案,但他暂时删除了它(我猜他正在努力让它变得更棒!:-))
  • Uao,@Arun 是 R 的魔术师。不过再次感谢 Simon 的帮助!
猜你喜欢
  • 2018-07-02
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多