这是我仅包含字符的较大数据框的示例。
df1 <- structure(list(V1 = c("00094", "00002", "00005", "00006", "00009",
"00010", "00012", "00013", "00015", "00017"), V2 = c(NA, NA,
NA, "2021-05-03", "2021-04-28", "Mentioned in T4 CRF", NA, "2022-10-10",
"Mentioned in B1 CRF", "2022-07-14 w/ PCR-test"), V3 = c(NA,
NA, NA, NA, "2022-07-12", "Antigen test, T4 CRF", NA, NA, NA,
NA), V4 = c(NA, NA, NA, NA, "2022-06-15", "2022-02-28", NA, NA,
NA, NA), V5 = c(NA, NA, NA, NA, NA, "Mentioned in B0 CRF", NA,
NA, NA, NA), V6 = c(NA_character_, NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_,
NA_character_, NA_character_), V7 = c(NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_)), row.names = c(NA,
10L), class = "data.frame")
有什么方法可以按一行中每个字符的长度对每一行进行排序吗?例如在第 6 行(其中 V1 = 00010),我希望 V1 保留在第一列(它在该行中的字符数也最少),然后是 V4(nchar = 10),然后是 V2 和 V5( nchar = 19) 最后是 V3 (nchar = 20)。有没有办法做到这一点?
是否也可以对 nchar=10 的字符串进行排序,这实际上是一个从旧到新的日期? - 我可以在对行进行排序后找到一种方法来执行此操作,但是如果有一种方法可以同时根据字符长度对行进行排序,那就太好了
非常感谢!
您可以使用
apply()
按nchar(x)
和x
本身的顺序对每一行进行排序。请注意,在输出的第 5 行中,2022-06-15
已移至 2022-07-12
的前面。
as.data.frame(t(apply(df1, 1, \(x) x[order(nchar(x), x)])))
V1 V2 V3 V4 V5 V6 V7
1 00094 <NA> <NA> <NA> <NA> <NA> <NA>
2 00002 <NA> <NA> <NA> <NA> <NA> <NA>
3 00005 <NA> <NA> <NA> <NA> <NA> <NA>
4 00006 2021-05-03 <NA> <NA> <NA> <NA> <NA>
5 00009 2021-04-28 2022-06-15 2022-07-12 <NA> <NA> <NA>
6 00010 2022-02-28 Mentioned in B0 CRF Mentioned in T4 CRF Antigen test, T4 CRF <NA> <NA>
7 00012 <NA> <NA> <NA> <NA> <NA> <NA>
8 00013 2022-10-10 <NA> <NA> <NA> <NA> <NA>
9 00015 Mentioned in B1 CRF <NA> <NA> <NA> <NA> <NA>
10 00017 2022-07-14 w/ PCR-test <NA> <NA> <NA> <NA> <NA>