按特定特征对R中的行进行排序

时间:2014-03-11 22:26:42

标签: r sorting

我已经阅读了一些已经回答并且相似的问题,但对于我的生活,我无法弄清楚如何将它应用到我的问题中。我有这样的数据框(有些条目是空白的,列数是由一个单词的发音指南决定的)

5   SUPERNATURALISM   S UW2   P ER0   N AE1  CH ER0 AH0   L IH2   Z AH0   M
6         ESTABLISH IH0   S   T AE1   B   L IH0  SH  
7            FABRIC   F AE1   B   R IH0   K 
1504         AMTRAK AE1   M   T   R AE0   K                                  

我基本上希望能够根据音节的数量对表格进行排序,并且通过每行中看到数字(0,1或2)的次数(0,1)很容易看到,或2表示元音上的压力.S,P等辅音不附带数字)

例如,第7行和第1504行都有2个音节,因为每行有2个数字(虽然在不同的列中),所以我希望它们在一起。

最后,我只想从我展示的4行中排序,顺序应为7,1504,6,5

有谁知道我应该写的代码?

3 个答案:

答案 0 :(得分:2)

您可以从每一行中提取数字,并根据位数(列表长度)对其进行排序

library(stringr)
## read lines
ll <- readLines(textConnection('5   SUPERNATURALISM   S UW2   P ER0   N AE1  CH ER0 AH0   L IH2   Z AH0   M
6         ESTABLISH IH0   S   T AE1   B   L IH0  SH  
7            FABRIC   F AE1   B   R IH0   K 
1504         AMTRAK AE1   M   T   R AE0   K '))
## extract digit , remove the first one and order 
ord <- order(sapply(str_extract_all(ll,'\\d+'),function(x)length(x[-1])))
## get the result
ll[ord]

[1] "7            FABRIC   F AE1   B   R IH0   K "                               
[2] "1504         AMTRAK AE1   M   T   R AE0   K "                               
[3] "6         ESTABLISH IH0   S   T AE1   B   L IH0  SH  "                      
[4] "5   SUPERNATURALISM   S UW2   P ER0   N AE1  CH ER0 AH0   L IH2   Z AH0   M"

答案 1 :(得分:1)

这是一个使用基础和正面后视正则表达式的解决方案(使用@ agstudy的数据):

len = unlist(lapply(ll, function(x) 
         length(gregexpr("(?<=[A-Za-z])[0-2]", x, perl=TRUE)[[1L]])))
ll[order(len)]

正则表达式(?<=[A-Za-z])[0-2]基本上意味着如果0-2之间有一个数字,并且它的前一个字符是任何一个字母,那么就是匹配。因为它需要PCRE,所以需要perl=TRUE来匹配前瞻和后瞻性正则表达式。

我们使用此正则表达式遍历llgregexpr返回一个列表,其中第一个索引返回匹配位置。因此,我们使用length(.)提取它,然后使用order重新排列ll

HTH

答案 2 :(得分:0)

您必须先处理数据,可能regex是可行的方法。这是一个解决方案(我将使用包stringr):

## your data
df <- read.table(text=
"5   SUPERNATURALISM   S UW2   P ER0   N AE1  CH ER0 AH0   L IH2   Z AH0   M
6         ESTABLISH IH0   S   T AE1   B   L IH0  SH  
7            FABRIC   F AE1   B   R IH0   K 
1504         AMTRAK AE1   M   T   R AE0   K                                  ",
                   fill=TRUE,
                   stringsAsFactors=FALSE)

操纵提取数字和计数:

library(stringr)
text <- apply(df[,3:16], 1,paste, collapse="")
numbers <- str_extract_all(text, "\\d+")
df$syllables <- sapply(numbers, length)

订单:

df <- df[order(df$syllables),]
df
    V1              V2  V3  V4 V5  V6  V7  V8  V9 V10 V11 V12 V13 V14 V15 V16 syllables
3    7          FABRIC   F AE1  B   R IH0   K                                         2
4 1504          AMTRAK AE1   M  T   R AE0   K                                         2
2    6       ESTABLISH IH0   S  T AE1   B   L IH0  SH                                 3
1    5 SUPERNATURALISM   S UW2  P ER0   N AE1  CH ER0 AH0   L IH2   Z AH0   M         7