在R中,如何根据值所属的bin对数据帧的每一行进行分类?

偷偷摸摸的

在R中,我想通过对值进行装箱并使用每个箱中的值的数量(总和)来对数据帧的每一行进行分类,以通过使用if-else逻辑将它们分为2组(类)。

  • 在R for循环中,我使用R cut和split命令按行对值进行分箱。
  • 箱(范围)为:1..9、10..19、20..29、30..39、40..49。
  • 如果一行包含一对落在同一bin(范围)中的值,例如10..19,则应将其分类为“ P”。如果它包含2对落入2个不同的容器(范围),则应将其分类为“ PP”。
  • 然后,我使用硬编码的条件/规则创建了两个名为p和pp的新变量。变量中的值是TRUE或FALSE,这取决于第n行是否满足那些规则。
  • 最后,我在if-else语句中使用p和pp作为条件,将每一行分配给P类(第一行)或PP类(第二行)。

首先,我创建了一个数据框x:

n1 <- c(1, 7); n2 <- c(2, 11); n3 <- c(10, 14); n4 <- c(23, 32); n5 <- c(37, 37); n6 <- c(45, 41)
x <- data.frame(n1, n2, n3, n4, n5, n6)
x
  n1 n2 n3 n4 n5 n6
1  1  2 10 23 37 45
2  7 11 14 32 37 41

第一行应归类为“ P”,因为它有1对值(1、2)落在同一个容器1..10中。
第二行应归类为“ PP”,因为它有2对值(11、14和32、37)分别落入2个档位:10..19和30..39。

因此,在创建数据框x之后,我创建了一个for循环:

for(i in nrow(x)){

# binning the data:
  bins <- split(as.numeric(x[i, ]), cut(as.numeric(x[i, ]), c(0, 9, 19, 29, 39, 49)))
  # creating the rule for p (1 pair of numbers falling in the same range)
  p <- (sum(lengths(bins) == 2) == 1 & sum(lengths(bins) == 1) == 4)
  # creating the rule for pp (2 different pairs, each has 2 numbers falling in the same range)
  pp <- (sum(lengths(bins) == 2) == 2 & sum(lengths(bins) == 1) == 2 & sum(lengths(bins) == 0) == 1)

  if(p){
    x$types <- "P"
  } else if(pp){
    x$types <- "PP"
  } else{
    stop("error")
  }
  }

print(x)

我想创建一个新的名为type的列,其中包含类P或PP:

  n1 n2 n3 n4 n5 n6 types
1  1  2 10 23 37 45 P
2  7 11 14 32 37 41 PP

相反,代码仅返回PP:

  n1 n2 n3 n4 n5 n6 types
1  1  2 10 23 37 45 PP
2  7 11 14 32 37 41 PP

这是因为循环在行上运行两次。但是,如果仅运行一次,则所有行都将分类为“ P”,而不是“ PP”。我希望这很简单,但到目前为止还无法弄清楚。

格雷戈尔·托马斯(Gregor Thomas)

for循环中的错误i分配时不使用typex$types <- "P"将整个types分配"P"x$types <- "PP"将整个types分配"PP"因此,无论最后结果是什么,这将是整个列的值。

另外,在添加之后使用完整的行 x[i, ]是很危险的types大概您不想尝试将“ P”和“ PP”值转换types为数字并将它们进行装箱。我建议创建types一个单独的向量,并仅在循环后将添加为列循环之前:types <- chracter(nrow(x))循环内:types[i] <-而不是x$types <-循环后,x$types <- types

您还犯了for (i in nrow(x))when时的经典语法错误for (i in 1:nrow(x))

解决所有这些问题:

n1 <- c(1, 7); n2 <- c(2, 11); n3 <- c(10, 14); n4 <- c(23, 32); n5 <- c(37, 37); n6 <- c(45, 41)
x <- data.frame(n1, n2, n3, n4, n5, n6)

types <- character(nrow(x))

for(i in 1:nrow(x)){
  # binning the data:
  bins <- split(as.numeric(x[i, ]), cut(as.numeric(x[i, ]), c(0, 9, 19, 29, 39, 49)))
  # creating the rule for p (1 pair of numbers falling in the same range)
  p <- (sum(lengths(bins) == 2) == 1 & sum(lengths(bins) == 1) == 4)
  # creating the rule for pp (2 different pairs, each has 2 numbers falling in the same range)
  pp <- (sum(lengths(bins) == 2) == 2 & sum(lengths(bins) == 1) == 2 & sum(lengths(bins) == 0) == 1)

  if(p){
    types[i] <- "P"
  } else if(pp){
    types[i] <- "PP"
  } else{
    stop("error")
  }
}

x$types <- types
x
#   n1 n2 n3 n4 n5 n6 types
# 1  1  2 10 23 37 45     P
# 2  7 11 14 32 37 41    PP

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何根据行的排序值对pandas数据帧的每一行进行排序并返回列索引

根据每一行中的字符串对数据进行分类

在 R 中,如何根据向量中的值对数据帧的行进行子集

有条件地对数据帧的每一行进行计数

如何在python中对pandas数据帧的每一行进行计算?

将数据帧中的每一行与 r 中另一个数据帧中的每一行进行匹配

如何将数据帧1的每一行与数据帧2的每一行进行比较?

根据每天在KDB中设置的间隔数对每一行进行分类?

如何将数据帧的每一行与R中的数据帧进行比较?

在R中,如何根据数据帧每一行的条件来更改字符串的值

根据条件并排除最后一行来对数据帧行进行分组和平均

将一个数据帧中的每一行与tidyverse中另一行的每一行进行比较

在R中:根据另一个表中的数据对数据帧中的行进行重新排序

如何基于R中的列对数据帧进行分类?

如何根据熊猫中的列值对数据进行分类?

根据组的第一行对组中的每一行进行突变

如何对熊猫数据框中的每一行进行排序并获取索引?

如何对数据框每一行的值进行排序并返回排序后的列名

根据R中某个值之上的每一行从一个数据帧创建多个数据帧

在R中,如何根据另一个数据帧中的范围对一个数据帧中的值进行分类?

修改数据帧每一行中的值

如何根据(第一行的值 + X)按组对数据表进行子集

对数据帧中一列的每10行进行平均,从其他项中抽取十分之一吗?

为r中的数据帧中的每一行选择最低的5个值的同名

将数据帧每一行中的每个元素除以 R 中其中一行中的值

在R中打印合并数据帧的每一行

R中具有数据帧的每一行的最小值

如何在回收值的同时将数据帧的每一行除以数据帧中相应列的行

如果值相同,如何比较数据帧1的每一行与数据帧2的每一行并求和?