检测R中的字母和数字顺序

时间:2018-01-18 17:33:02

标签: r alphabetical numerical

我需要一个R代​​码,告诉我每行中的值是按照字母顺序和数字顺序排列的。按字母顺序,我的意思是比较一行中每列中的单元格,从第一个单元格开始到最后一个单元格。 alphabetical_row = c(A61B,H01J,H03B,G01Q)的示例。

row1 <- c("G01N 23/20", "G01N 23/203", "G01Q 30/00", "G01Q 30/04", "G01Q 30/18", "H01J 37/252", "H01J 37/252")
row2 <- c("G01S 7/38", "G01S 7/38", "H03B 21/00", "H03B 21/02", NA, NA, NA)
row3 <- c("A61B 8/00", "A61B 8/00", "G01S 7/52", "G01S 7/52", NA, NA, NA)

 df <-      data.frame(rbind(row1, row2, row3))

我正在寻找的输出是一个新的列,如果行中的值是有序的,则为TRUE,对于每一行,如果值不是有序的话,则为FALSE。

但是,让我们从前4位开始:

row1 <- c("G01N", "G01N", "G01Q", "G01Q", "G01Q", "H01J", "H01J")
row2 <- c("G01S", "G01S", "H03B", "H03B", NA, NA, NA)
row3 <- c("A61B", "A61B", "G01S", "G01S", NA, NA, NA)

 df <-      data.frame(rbind(row1, row2, row3))

期望的输出:

df <- data.frame(cbind(df, c(TRUE, TRUE, TRUE))) 

在这种情况下,输出将为:FALSE,FALSE,TRUE,因为只有row3按字母顺序排列,从单元格1(A61B)到单元格4(G01S)。

1 个答案:

答案 0 :(得分:2)

这将测试字母顺序,并且还要求NA值为最后一个。您的示例数据使用factor列,但我强烈建议将它们转换为characteras.character()),因为行而不是列是有意义的。如果数据框的列是字符,那么您可以省略答案的as.character()部分。如果您要调整NA行为,请参阅?order了解选项。

df$ordered = apply(df, 1, function(x) identical(order(as.character(x)), seq_along(x)))

df 
#        X1   X2   X3   X4   X5   X6   X7 ordered
# row1 G01N G01N G01Q G01Q G01Q H01J H01J    TRUE
# row2 G01S G01S H03B H03B <NA> <NA> <NA>    TRUE
# row3 A61B A61B G01S G01S <NA> <NA> <NA>    TRUE