我已经阅读了一些已经回答并且相似的问题,但对于我的生活,我无法弄清楚如何将它应用到我的问题中。我有这样的数据框(有些条目是空白的,列数是由一个单词的发音指南决定的)
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
有谁知道我应该写的代码?
答案 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
来匹配前瞻和后瞻性正则表达式。
我们使用此正则表达式遍历ll
。 gregexpr
返回一个列表,其中第一个索引返回匹配位置。因此,我们使用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