我有一个函数可以计算任何脚本的字母和字符的出现次数。但是,我不知道如何从给定脚本中提取单个字母(字符)的列和行索引。你能指导我并以简单的方式解释如何做到这一点吗?
作为一个例子,我使用了一个名为September的脚本,其中只存储了单词September。
我的功能:
fun <- function(filename)
{
file <- paste(readLines(filename), collapse = '')
chars <- strsplit(file, NULL)[[1]]
summary(factor(chars))
}
source('September.r')
data.frame(fun('September.r'))
结果:
b 1
e 3
m 1
p 1
r 1
S 1
t 1
我想得到类似的东西:
char count row col
b 1 1 7
e 3 1 2,5,8
m 1 1 6
p 1 1 3
r 1 1 9
S 1 1 1
t 1 1 4
当我测试@akrun代码时,我注意到该程序在更多文本上工作不正常。
text <- "September,
September, September,
September, September"
从下面的示例中可以看出,程序不计算列索引。因为每个新行的列数应从1开始计算。不应提前设置行数。你能帮忙吗?
# A tibble: 10 x 4
char Count row col
<chr> <int> <dbl> <chr>
1 2 1 22, 44
2 "\n" 2 1 11, 33
3 , 4 1 10, 21, 32, 43
4 b 5 1 7, 18, 29, 40, 51
5 e 15 1 2, 5, 8, 13, 16, 19, 24, 27, 30, 35, 38, 41, 46, 49, 52
6 m 5 1 6, 17, 28, 39, 50
7 p 5 1 3, 14, 25, 36, 47
8 r 5 1 9, 20, 31, 42, 53
9 S 5 1 1, 12, 23, 34, 45
10 t 5 1 4, 15, 26, 37, 48
答案 0 :(得分:1)
以下是dplyr
的一个解决方案:
library(dplyr)
text = "September."
unique(unlist(strsplit(text, ""))) %>%
sapply(gregexpr, text, fixed = TRUE) %>%
unlist() %>%
data.frame(letter = names(.), col = .) %>%
group_by(letter = gsub("^(.).*", "\\1", letter)) %>%
summarize(count = n(),
col = paste(col, collapse = ","))
<强>结果:强>
# A tibble: 8 x 3
letter count col
<chr> <int> <chr>
1 . 1 10
2 b 1 7
3 e 3 2,5,8
4 m 1 6
5 p 1 3
6 r 1 9
7 S 1 1
8 t 1 4
要修改它以使其成为接受文件连接的函数,请编写以下内容:
char_ind_count = function(file_path){
text = paste(readLines(file_path), collapse = '')
unique(unlist(strsplit(text, ""))) %>%
sapply(gregexpr, text, fixed = TRUE) %>%
unlist() %>%
data.frame(letter = names(.), col = .) %>%
group_by(letter = gsub("^(.).*", "\\1", letter)) %>%
summarize(count = n(),
col = paste(col, collapse = ","))
}
提供文件路径或使用textConnection
提供字符串:
char_ind_count("<path_to_file>/extract_index_cols.txt")
char_ind_count(textConnection(text1))
答案 1 :(得分:1)
如果'text'是一个字符串,那么这是tidyverse
library(tidyverse)
str_split(text, "")[[1]] %>%
tibble(char = .) %>%
rownames_to_column('rn') %>%
group_by(char) %>%
summarise(Count = n(), row = 1, col = toString(rn))
# A tibble: 7 x 4
# char Count row col
# <chr> <int> <dbl> <chr>
#1 b 1 1 7
#2 e 3 1 2, 5, 8
#3 m 1 1 6
#4 p 1 1 3
#5 r 1 1 9
#6 S 1 1 1
#7 t 1 1 4
text <- "September"