R 调查结果;几乎是";复制数据表中的索引并计算增量
我有一个很小的(2k)数据集,其中包含学生填写的问卷答案,这些学生每年抽样两次。并非所有参加第一波的学生都参加了第二波,反之亦然。为每个学生创建一个唯一的id,该id由学校代码、班级代码、学生编号和小数点后的波形组成。例如,100612.1是名单上10所学校6年级12年级的学生,这是第一波。小数点后面的想法是一种在数据集中再次识别同一个学生的方法(与给定id相差小于abs(1)的唯一值是另一个波形上的同一个学生)。至少这是个想法 我正在考虑一个脚本,它将执行以下操作: -查找彼此的唯一id小于abs(1)的行 -对于这些行,生成一个新行(在一个新表中),其中包含学生id和测量变量的增量(即第2波中的值-第1波中的值) 我对R很陌生,但我对其他OOP有一点背景知识。我考虑创建一个从1到长度(df)的for循环,只寻找它的“兄弟”。我的直觉告诉我这不是R的工作方式。有什么想法吗? 我所需要的只是一种快速筛选数据的方法,以查找第二波行。我认为剩下的应该从那里开始 谢谢你的帮助R 调查结果;几乎是";复制数据表中的索引并计算增量,r,R,我有一个很小的(2k)数据集,其中包含学生填写的问卷答案,这些学生每年抽样两次。并非所有参加第一波的学生都参加了第二波,反之亦然。为每个学生创建一个唯一的id,该id由学校代码、班级代码、学生编号和小数点后的波形组成。例如,100612.1是名单上10所学校6年级12年级的学生,这是第一波。小数点后面的想法是一种在数据集中再次识别同一个学生的方法(与给定id相差小于abs(1)的唯一值是另一个波形上的同一个学生)。至少这是个想法 我正在考虑一个脚本,它将执行以下操作: -查找彼此的唯一id小于a
由于这是我在这里的第一篇文章,我为这篇文章中的任何错误行为提前道歉…:) 我想到了两种方法。最简单的方法是使用函数floor(),该函数返回整数,例如:
floor(100612.1)
#[1] 100612
floor(9.9)
#[1] 9
或者,您也可以编写一个相当简单的正则表达式来去掉小数点。然后,可以使用unique()查找重复项或非重复项的行 让我们制作一些假数据,这样我们就可以很容易地看到我们的问题:
ids <- c(100612.1,100612.2,100613.1,100613.2,110714.1,201802.2)
answers <- c(5,4,3,4,1,0)
survey <- data.frame(ids,answers)
这个问题暗指的是
data.table
,所以这里有一种方法可以使用这个包来修改@jed的答案
ids <- c(100612.1,100612.2,100613.1,100613.2,110714.1,201802.2)
answers <- c(5,4,3,4,1,0)
要删除增量为NA值的行,请执行以下操作:
unique(surveyDT[, .SD[(!is.na(delta))], by = child])
child ids answers wave delta
1: 100612 100612.1 5 1 -1
2: 100613 100613.1 3 1 1
使用.SDcols
仅输出特定列(除了by
列之外),例如
unique(surveyDT[, .SD[(!is.na(delta))], by = child, .SDcols = 'delta'])
child delta
1: 100612 -1
2: 100613 1
我花了一些时间来熟悉
数据表语法,但现在我发现它更直观,而且对于大数据来说也更快捷。切掉小数点,然后根据剩余id(100612)计算汇总统计数据(即,增量)。谢谢!我在R中运行了代码以进行跟踪。提到的唯一id是从数据中的现有变量创建的。i、 我有一个“波浪”变量。现在我明白你的建议了,设置为“child,wave”的键不也是这样吗?另外,你最后的代码对我来说有点模糊。。。再次感谢您的快速重播!这些都是好主意。@isomitzi我在最后一段代码中所做的就是。。。如果一个孩子在两个波中都有答案,我会从第二波的分数中减去第一波的分数。所以孩子100612在第1波中有一个5,在第2波中有一个4,所以他的增量是-1。谢谢!如果你不介意的话,下面是一个简短的问题:-不需要substr,因为我可以不使用wave创建子ID。我说的对吗如果我必须减去多个列,我能一次计算所有列吗?调查[,delta1:=diff(答案),delta2:=diff(答案2),by=child]沿着这些线做什么有没有办法过滤掉没有两个波的结果?我在考虑用完整的箱子。。再次感谢你!!如果您在问题中发布数据集的示例,这些类型的问题将更容易回答。完成。案例可以在此处使用,但请注意,它会删除任何列中带有NA的行。有关从特定列中筛选NA的方法,请参见编辑的答案。Re:多列计算,请遵循我在示例中如何使用带有反勾号的:=
来指定子级和波。有关详细信息,请参阅帮助(':=')
。
ids <- c(100612.1,100612.2,100613.1,100613.2,110714.1,201802.2)
answers <- c(5,4,3,4,1,0)
library(data.table)
surveyDT <- data.table(ids, answers)
surveyDT[, `:=` (child = substr(ids, 1, 6), wave = substr(ids, 8, 8))] # split ID's
# note multiple assign-by-reference := syntax above
setkey(surveyDT, child, wave) # order data
# calculate delta on keyed data, grouping by child
surveyDT[, delta := diff(answers), by = child]
unique(surveyDT[, delta, by = child]) # list results
child delta
1: 100612 -1
2: 100613 1
3: 110714 NA
4: 201802 NA
unique(surveyDT[, .SD[(!is.na(delta))], by = child])
child ids answers wave delta
1: 100612 100612.1 5 1 -1
2: 100613 100613.1 3 1 1
unique(surveyDT[, .SD[(!is.na(delta))], by = child, .SDcols = 'delta'])
child delta
1: 100612 -1
2: 100613 1