检测R中的字母和数字顺序
detect alphabetical and numerical order in R
我需要一个 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,因为只有第 3 行是按字母顺序排列的,从单元格 1 (A61B) 到单元格 4 (G01S)。
这将测试字母顺序,并且还要求 NA
值排在最后。您的示例数据使用 factor
列,但我强烈建议将它们转换为 character
(使用 as.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
我需要一个 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,因为只有第 3 行是按字母顺序排列的,从单元格 1 (A61B) 到单元格 4 (G01S)。
这将测试字母顺序,并且还要求 NA
值排在最后。您的示例数据使用 factor
列,但我强烈建议将它们转换为 character
(使用 as.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