R 调查结果;几乎是";复制数据表中的索引并计算增量

R 调查结果;几乎是";复制数据表中的索引并计算增量,r,R,我有一个很小的(2k)数据集,其中包含学生填写的问卷答案,这些学生每年抽样两次。并非所有参加第一波的学生都参加了第二波,反之亦然。为每个学生创建一个唯一的id,该id由学校代码、班级代码、学生编号和小数点后的波形组成。例如,100612.1是名单上10所学校6年级12年级的学生,这是第一波。小数点后面的想法是一种在数据集中再次识别同一个学生的方法(与给定id相差小于abs(1)的唯一值是另一个波形上的同一个学生)。至少这是个想法 我正在考虑一个脚本,它将执行以下操作: -查找彼此的唯一id小于a

我有一个很小的(2k)数据集,其中包含学生填写的问卷答案,这些学生每年抽样两次。并非所有参加第一波的学生都参加了第二波,反之亦然。为每个学生创建一个唯一的id,该id由学校代码、班级代码、学生编号和小数点后的波形组成。例如,100612.1是名单上10所学校6年级12年级的学生,这是第一波。小数点后面的想法是一种在数据集中再次识别同一个学生的方法(与给定id相差小于abs(1)的唯一值是另一个波形上的同一个学生)。至少这是个想法

我正在考虑一个脚本,它将执行以下操作: -查找彼此的唯一id小于abs(1)的行 -对于这些行,生成一个新行(在一个新表中),其中包含学生id和测量变量的增量(即第2波中的值-第1波中的值)

我对R很陌生,但我对其他OOP有一点背景知识。我考虑创建一个从1到长度(df)的for循环,只寻找它的“兄弟”。我的直觉告诉我这不是R的工作方式。有什么想法吗? 我所需要的只是一种快速筛选数据的方法,以查找第二波行。我认为剩下的应该从那里开始

谢谢你的帮助


由于这是我在这里的第一篇文章,我为这篇文章中的任何错误行为提前道歉…:)

我想到了两种方法。最简单的方法是使用函数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