【问题标题】:Data table/frame: Assign numbers to a column based on the order of values in another column数据表/框架:根据另一列中值的顺序为一列分配数字
【发布时间】:2021-11-09 23:24:05
【问题描述】:

我正在尝试创建一个新列(下表中的expected_result),根据“两个相同刺激之间有多少不同的刺激”分配数字(如果最后一行是相同的刺激,如果最后一行是相同的刺激,则为 2,等等)。此外,刺激第一次出现的时间是 1 而不是 0。

在下面的示例中,

  1. stimulus 列的第一个元素是 'CS',因此预期结果是 '1'
  2. stimulus 列的第二个和第三个元素仍然是 'CS',对于它们来说,最后一行是与自身相同的元素,所以预期结果仍然是'1'
  3. 对于第三行之后的下一个'CS'(也就是第6行),在最后一个'CS'之前还有3行,所以预期的结果是3.

我想将此规则应用于列刺激中的每个元素

示例数据

example <- structure(list(stimulus = c("CS", "CS", "CS", "S2", "S2", "CS", 
"S3", "S2", "S3"), expected_result = c(1, 1, 1, 1, 1, 3, 1, 3, 
2)), row.names = c(NA, -9L), class = c("data.table", "data.frame"
))

【问题讨论】:

  • 我不明白你的问题 - 你能说得清楚一点吗?
  • @DanielV,对不起,我在问题中添加了一些解释,希望现在更清楚。规则是'根据列中最后一个相同元素的行数分配数字,当最后一个相同元素(第一次出现)有0行时分配1而不是0'

标签: r


【解决方案1】:

这是data.table 方法。
计算结果在result-列中。

library(data.table)
setDT(example)
example[, id := .I]
example[, result := id - shift(id, type = "lag", fill = (id[1] - 1)), by = .(stimulus)][]
#    stimulus expected_result id result
# 1:       CS               1  1      1
# 2:       CS               1  2      1
# 3:       CS               1  3      1
# 4:       S2               1  4      1
# 5:       S2               1  5      1
# 6:       CS               3  6      3
# 7:       S3               1  7      1
# 8:       S2               3  8      3
# 9:       S3               2  9      2

【讨论】:

    猜你喜欢
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2017-11-11
    相关资源
    最近更新 更多