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

在R中,如何根据数据帧中每一行的值所属的bin对其进行分类?,r,for-loop,if-statement,grouping,binning,R,For Loop,If Statement,Grouping,Binning,在R中,我想通过对值进行装箱并使用每个箱子中的值的数量(总和)来对数据帧的每一行进行分类,并使用if-else逻辑将它们分配到2个组(类) 在R for循环中,我使用R cut和split命令来存储 按行显示值 箱子(范围)为:1..9、10..19、20..29、30..39、40..49 如果一行包含1对落在同一存储单元(范围)中的值, 比如说10..19,那么它应该被归类为“P”。如果它包含2个 分成两个不同的箱子(范围)的对,则应 分类为“PP” 然后,我使用硬编码创建了两个新变量p和

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

  • 在R for循环中,我使用R cut和split命令来存储 按行显示值
  • 箱子(范围)为:1..9、10..19、20..29、30..39、40..49
  • 如果一行包含1对落在同一存储单元(范围)中的值, 比如说10..19,那么它应该被归类为“P”。如果它包含2个 分成两个不同的箱子(范围)的对,则应 分类为“PP”
  • 然后,我使用硬编码创建了两个新变量p和pp 条件/规则。变量中的值为TRUE或TRUE FALSE,取决于第n行是否符合这些规则
  • 最后,我在if-else语句中使用p和pp作为条件 将每行分配给P类(第1行)或PP类(第2行)
首先,我创建了一个数据帧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
相反,代码只返回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”。我想这是一件非常简单的事情,只是到目前为止还没有弄明白。

这不太好看

x['types'] <- apply(x, 1, function(a) {stringr::str_replace_all(paste(+(table(floor(a/10)) > 1), collapse=""), c('1'='P','0'=''))})
不太好看

x['types'] <- apply(x, 1, function(a) {stringr::str_replace_all(paste(+(table(floor(a/10)) > 1), collapse=""), c('1'='P','0'=''))})

for
循环中的错误是在分配
类型时未使用
i
x$types在
for
循环中的错误是在分配
类型时没有使用
i
x$类型可能只需使用
cut
并设置
标签
?应用循环有什么原因吗?for循环不是必需的,但使用标签:我不知道,因为我想使用创建变量p和PPP时定义的规则,可能只是使用
cut
和set
标签
?应用循环有什么原因吗?for循环不是必需的,但是使用标签:我不知道,因为我想使用创建变量p和ppp时定义的规则谢谢。问题是它不是一个二进制的情况(即,如果不是p,那么是pp)。我的意思是,它不是:如果x<1做这个,如果x>1做那个。我只是没有粘贴整个代码来简化事情。如代码所示,规则是硬编码的,就像模板:p谢谢。问题是它不是一个二进制的情况(即,如果不是p,那么是pp)。我的意思是,它不是:如果x<1做这个,如果x>1做那个。我只是没有粘贴整个代码来简化事情。如代码所示,规则是硬编码的,就像模板一样:p谢谢你指出的事情。我自己也很难弄明白。所以,现在它起作用了。奇怪的是,我没有提供完整的代码(为了简洁起见),在没有x$types的情况下工作得更好。谢谢您指出的事情。我自己也很难弄明白。所以,现在它起作用了。奇怪的是,我没有提供完整的代码(为了简洁起见),在没有x$类型的情况下工作得更好
x['types'] <- apply(x, 1, function(a) {stringr::str_replace_all(paste(+(table(floor(a/10)) > 1), collapse=""), c('1'='P','0'=''))})
  n1 n2 n3 n4 n5 n6 types
1  1  2 10 23 37 45     P
2  7 11 14 32 37 41    PP
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