определить алфавитный и числовой порядок в R

Мне понадобится код R, который сообщает мне, были ли значения в каждой строке размещены в алфавитном и числовом порядке для каждой строки. Под алфавитным порядком я подразумеваю сравнение ячеек в каждом столбце строки, начиная с первой ячейки до последней. Пример алфавитного_строка = 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))) 

в этом случае вывод будет: ЛОЖЬ, ЛОЖЬ, ИСТИНА, потому что только строка 3 находится в алфавитном порядке, от ячейки 1 (A61B) до ячейки 4 (G01S).


person Amleto    schedule 18.01.2018    source источник
comment
Можете ли вы отредактировать синтаксис кода R, чтобы он не вызывал ошибок? (Кроме того, возможно, переименуйте row1 в col1...)   -  person Gregor Thomas    schedule 18.01.2018
comment
Также было бы неплохо привести пример желаемого результата. Алфавитный порядок и числовой порядок различаются, и пример вывода для этого ввода поможет прояснить любую путаницу. Например, G01N 23/20 стоит перед G01N 23/203 по алфавиту и численно, если / является частью строки, но после него, если мы рассматриваем / как деление. Но деление не имеет смысла, потому что у вас есть 30/00 позже, и вы не можете делить на 0.   -  person Gregor Thomas    schedule 18.01.2018
comment
Можете ли вы привести пример ИСТИНА и ЛОЖЬ? Является ли G01N 23/2 ЛОЖЬЮ, потому что номер не заказан?   -  person Matt W.    schedule 18.01.2018
comment
Объясните пожалуйста логику результата? Начиная с первых 4 цифр, мне кажется, что каждая строка находится в алфавитном порядке. Например, первая строка G01N < G01Q < H01J. N предшествует Q, а G предшествует H. Почему ваш результат FALSE? Строка 2 также в алфавитном порядке, потому что G стоит перед H.   -  person Gregor Thomas    schedule 18.01.2018


Ответы (1)


Это проверит алфавитный порядок, а также потребует, чтобы значения 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
person Gregor Thomas    schedule 18.01.2018