R语言 将列值分类到具有特定输出的新列中

z4bn682m  于 2022-12-30  发布在  其他
关注(0)|答案(2)|浏览(149)

我希望根据应用于给定数值引用列的阈值对数据框的行进行分类。如果引用列的值低于阈值,则结果为0,我希望将其添加到新列。如果引用列的值高于阈值,则新列将在所有具有超过阈值的值的连续行中具有值1,直到出现新的0结果。如果新的参考值超过阈值,则要添加的值为2,依此类推。
如果我们设置阈值〉2,则我想要获得的示例是:
| 行|参考文献|结果|
| - ------|- ------|- ------|
| 1个|第二章|无|
| 第二章|1个|无|
| 三个|四个|1个|
| 四个|三个|1个|
| 五个|1个|无|
| 六个|六个|第二章|
| 七|八个|第二章|
| 八个|四个|第二章|
| 九|1个|无|
| 十个|三个|三个|
| 十一|六个|三个|

row <- c(1:11)
reference <- c(2,1,4,3,1,6,8,4,1,3,6)
result <- c(0,0,1,1,0,2,2,2,0,3,3)
table <- cbind(row, reference, result)

谢谢大家!

jfewjypa

jfewjypa1#

我们可以使用游程编码(rle)来实现。
以下假设为data.frame

r <- rle(quux$reference <= 2)
r$values <- ifelse(r$values, 0, cumsum(r$values))
quux$result2 <- inverse.rle(r)
quux
#    row reference result result2
# 1    1         2      0       0
# 2    2         1      0       0
# 3    3         4      1       1
# 4    4         3      1       1
# 5    5         1      0       0
# 6    6         6      2       2
# 7    7         8      2       2
# 8    8         4      2       2
# 9    9         1      0       0
# 10  10         3      3       3
# 11  11         6      3       3

数据类型

quux <- structure(list(row = 1:11, reference = c(2, 1, 4, 3, 1, 6, 8, 4, 1, 3, 6), result = c(0, 0, 1, 1, 0, 2, 2, 2, 0, 3, 3)), row.names = c(NA, -11L), class = "data.frame")
bgtovc5b

bgtovc5b2#

正如@Sotos的评论中所指出的,将考虑为您的对象使用替代名称。
由于不清楚是data.frame还是matrix,假设我们有一个基于您的数据的data.frame df

df <- as.data.frame(table)

并且具有阈值2:

threshold = 2

您可以通过@flodel修改this solution

df$new_result = ifelse(
  x <- reference > threshold, 
  cumsum(c(x[1], diff(x) == 1)), 
  0)
df

在这种情况下,diff(x)将包括一个向量,其中值1指示result应增加cumsum的位置(在示例数据中,这发生在第3、6和10行)。这些是从FALSE到TRUE的转换(0到1),其中referencethreshold之下到threshold之上。注意,由于diff值的长度将短1个元素,因此添加/组合x[1]
使用ifelse时,这些新的增量值仅适用于reference超过threshold的值,否则设置为0。

    • 产出**
row reference result new_result
1    1         2      0          0
2    2         1      0          0
3    3         4      1          1
4    4         3      1          1
5    5         1      0          0
6    6         6      2          2
7    7         8      2          2
8    8         4      2          2
9    9         1      0          0
10  10         3      3          3
11  11         6      3          3

相关问题