我对R很陌生,并且已经挣扎了几天来做一些Stata非常简单的事情.朋友给了我一个相对复杂的答案来回答这个问题,但我想知道是否有一个简单的方法可以做到以下几点.
假设我有一个两个变量数据帧,组织如下:
category var1
a 1
a 2
a 3
b 4
b 6
b 8
b 10
c 11
c 14
c 17
Run Code Online (Sandbox Code Playgroud)
我要生成另外五个变量,每个应插入此相同的数据帧:var2
,var3
,var4
,var5
,和var6
(1)var2
是一个虚拟变量,它取每个类别中第一次观察的值1(即,由三个组定义的每一个category
),否则为0.
(2)var3
是一个虚拟变量,它取每个类别中最后一次观察的值1,否则为0.
(3)var4
计算任何特定观察所属的每组中的观察数量(即,3为category
a,4为category
b,3为category
c)
(4)var5
记录每次观察var1
与其上方观察的差异
(5)var6
记录每次观察var1
与其上方观察之间的差异,但仅限于由其定义的组内category
.
我对Stata非常熟悉,我发现使用bysort
prefix命令并不难做到.例如,var1
很容易生成bysort category: gen var1=1 if _n==1
.但是我在最后一天试图弄清楚如何使用R来解决它们.我确信有几种解决方案(我的朋友参与了ddplyr
包装,这似乎比我的工资高出一步).没有什么比这更容易了bysort
吗?
最终数据集应如下所示: …
我有一大组大小为 M 的(假设为 10),并且我想重复一定次数(假设为 13),将其随机分成 M/N 个较小的组,大小为 N(假设为 2)。我不希望大集合中的任何元素都在重复组中,直到他们与其他每个元素都在一个小组中。(这里的实际问题是:我有一个 10 人的班级,我想将他们分成 5 对,持续 13 周,但我不希望任何人重复配对,直到他们与班上的每个人。)
我怎样才能做到这一点?我首先 [从我的大组中生成非重复排列][1],但我遇到的问题是这些独特的排列不一定会产生独特的组。(似乎有人提出了同样的问题,但 [它已在 Python 中解决][2]。我不懂 Python,所以我正在寻找一个简单的 R 解决方案。)
非常感谢任何帮助。
编辑:感谢大家的建议。我意识到我最初的问题并不完全清楚。当我每次只想将集合拆分为大小为 N 的单个子集时,下面建议的解决方案效果很好。但我的问题实际上是我想将集合拆分为大小为 N 的 M/N 个子集。例如,以我的班级为例,我想在 13 个不同的场合将 10 个学生分成 5 对 2,我希望配对是唯一的,直到它们不再是唯一的(即,经过 9 次之后)。除非我不知道如何应用它们,否则我认为这些解决方案中的任何一个都不能完全解决这个问题。
我有一个非常直截了当的问题,即使经过几个小时的烦恼也让我感到悲伤,所以我想我会问你的帮助.我正在寻找一种直接的方法来返回一个仅包含某个原始矢量的最后一个元素的矢量.
这是我原来的矢量'a':
a<-c(0,0,1,0,0,1,0,0,1,0)
Run Code Online (Sandbox Code Playgroud)
我想生成向量'b',它与'a'的长度相同,并且只带有它的最后一个非缺失元素.换一种说法,
b = (0,0,0,0,0,0,0,0,1,0)
Run Code Online (Sandbox Code Playgroud)
我已经能够通过构建一个从向量'a'的末尾向后运行到第一个元素的循环来做到这一点,但这看起来显得不那么优雅.我相信有更好的方法.
如果有人好奇,那么更大的问题是:我试图改变一个向量的值,它对应于另一个向量的最后一个非缺失元素.
非常感谢您的帮助.
我通常使用arrange()
from 函数dplyr
对数据集进行排序,但它的行为方式我无法理解。我花了一点时间才弄清楚这件事的真相。我已经修复了我的代码并曾经order()
做过同样的事情,但现在我很好奇。我已经arrange()
不假思索地使用了很多年了,我想知道为什么这似乎是默认行为。当涉及大写字母时,它似乎无法按字母顺序排序 - 例如,它认为大写字母应该排在小写字母之前,即使后者在字母表中位于小写字母之前。我错过了什么吗?
这并不总是一个问题,但当我在tapply()
安排 via 后立即使用时,它确实成为了一个问题,假设数据将以与运行时排序arrange()
相同的方式排序。这是将“苏联”放在“乌干达”和“乌克兰”之前tapply()
的示例,而(我认为正确!)将其放在最后。arrange()
order()
library(dplyr)
countries<-c("USSR","Uganda","Ukraine")
tmp<-data.frame(countries,stringsAsFactors=F)
tmp %>% arrange(countries) #orders it one way
tmp[order(tmp$countries),] #orders it another way
sort(tmp$countries) #sort agrees with order
Run Code Online (Sandbox Code Playgroud)
我环顾四周,看看其他人是否也遇到过同样的问题,但什么也没看到。如果之前已经讨论过这个问题,请原谅我。
我无法弄清楚为什么我在正确计算贝叶斯信息准则时会遇到麻烦,并希望有人可以指出正确的方向。
我这样做是因为我尝试手动计算BIC(对于plm
似乎没有与之相关联的已建立例程的对象)。我从Wikipedia页面获取了公式,该页面以残差平方和而不是对数似然来给出BIC的公式。
y<-rnorm(100)
x<-rnorm(100)
m.test<-lm(y ~ x)
n<-100
rss<-sum(m.test$residuals^2)
k<-3
bic.mine<-n*log(rss/n)+k*log(n) #formula from wikipedia
bic.stats<-BIC(m.test) #using stats package
abs(bic.mine-bic.stats) #mine is off!
Run Code Online (Sandbox Code Playgroud)
多次运行该代码,我意识到我获得的BIC和从stats软件包获得的BIC之间的差异是恒定的,因此我怀疑我缺少某种缩放因子。那正确吗?提前致谢。
编辑:谢谢所有的评论。我尝试实施建议并发布答案,但仍然不知所措。修改后的代码如下。
y<-rnorm(100)
x<-rnorm(100)
m.test<-lm(y ~ x)
n<-100
res<-m.test$residuals
rss<-sum(res^2)
k<-3; df<-n-k; w<-rep(1,N) #params, dfs, weights
ll<-0.5 * (sum(log(w)) - n *
(log(2 * pi) + 1 - log(n) + log(sum(w * res^2))))
ll.stats<-logLik(m.test)
abs(ll.stats-ll)==0 #same, prob is not here
bic.mine<-n*log(rss/n)+k*log(n) #formula from wikipedia
bic.exact<- -2 * ll + log(n) * …
Run Code Online (Sandbox Code Playgroud) 什么是一个聪明的(即,不是循环)方式来获得向量中每个缺失值的长度?我的理想输出是一个长度相同的向量,其中每个缺失值被它所属的缺失值的法术长度替换,所有其他值都是0.
所以,对于像这样的输入:
x <- c(2,6,1,2,NA,NA,NA,3,4,NA,NA)
Run Code Online (Sandbox Code Playgroud)
我想输出像:
y <- c(0,0,0,0,3,3,3,0,0,2,2)
Run Code Online (Sandbox Code Playgroud) 寻找一个快速简单的解决方案来解决我只能通过循环来解决的问题.我有一个ID向量,看起来像这样:
id<-c(NA,NA,1,1,1,NA,1,NA,2,2,2,NA,3,NA,3,3,3)
Run Code Online (Sandbox Code Playgroud)
落在一个数字序列(id[6], id[14]
)之间的NA 需要被该数字替换.然而,不满足这种条件的NA(两个不同数字的序列之间的那些)需要保持单独(即id[1],id[2],id[8],id[12]
).因此,目标向量是:
id.target<-c(NA,NA,1,1,1,1,1,NA,2,2,2,NA,3,3,3,3,3)
Run Code Online (Sandbox Code Playgroud)
循环遍历每个值并不困难,但我希望对许多很长的向量做这个,并希望有一个更简洁的解决方案.谢谢你的任何建议.