如何在R中提取索引列和索引行?

如何在R中提取索引列和索引行?,r,R,我有一个计算任何脚本中字母和字符出现次数的函数。但是,我不知道如何从给定脚本中提取单个字母(字符)的列和行索引。你能用一种简单的方式指导我并解释一下怎么做吗 例如,我使用了一个名为“九月”的脚本,其中只存储单词“九月” 我的职能: fun <- function(filename) { file <- paste(readLines(filename), collapse = '') chars <- strsplit(file, NULL)[[1]] summar

我有一个计算任何脚本中字母和字符出现次数的函数。但是,我不知道如何从给定脚本中提取单个字母(字符)的列和行索引。你能用一种简单的方式指导我并解释一下怎么做吗

例如,我使用了一个名为“九月”的脚本,其中只存储单词“九月”

我的职能:

fun <- function(filename)
{
  file <- paste(readLines(filename), collapse = '')
  chars <- strsplit(file, NULL)[[1]]
  summary(factor(chars))
}
source('September.r')
data.frame(fun('September.r'))
我想得到这样的东西:

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"

text这里有一个使用
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
提供文件路径或使用
textConnection
提供字符串:

char_ind_count("<path_to_file>/extract_index_cols.txt")
char_ind_count(textConnection(text1)) 
char\u ind\u count(“/extract\u index\u cols.txt”)
字符索引计数(textConnection(text1))

如果“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
库(tidyverse)
str_拆分(文本“”[[1]]%>%
TIBLE(字符=)%>%
行名到列('rn')%>%
分组依据(字符)%>%
汇总(计数=n(),行=1,列=toString(rn))
#一个tibble:7x4
#字符计数行列
#       
#1b117
#2 e 3 1 2 5 8
#3米11 6
#4p113
#5 r 11 9
#6 S 1 1
#7T114
数据
text您能否展示一个可复制的小示例以获得输出?示例是我的函数,我的意思是如何获取列和行的索引,以便函数返回上面的内容。我的意思是关于您函数的输入数据。你是说其他人应该自己构造数据并测试你的函数吗?函数应该适用于每个脚本,我的脚本只包含单词“九月”。这个函数运行得很好。关于你的数据是什么样子的,还不完全清楚
set.seed(24);m1非常感谢,我如何才能让它工作,以便加载任何脚本?@Kim这取决于您试图加载的“脚本”。您是否正在加载
.txt
文件,其中每个文本文件仅包含您试图计算索引的文本?我考虑将源设置为任意script@Kim你能说得更具体些吗?所以你想让它能够读取任何文件类型?还是只是文本文件?@Kim查看我的更新。我希望这就是你要找的。如果您读取的是R脚本而不是文本文件,只需保存R脚本并在函数中提供该脚本的路径。我的意思是创建一个以R文件为基础的函数和一个源函数,就像我最初的示例中一样。@Kim只需在
函数(文件路径){text=paste(读取行(文件路径))上方添加该行即可,collapse='';
我仍然有一个问题,我如何在代码中设置来搜索我,例如,仅字符串c(“S”,“b”)?@Kim您可以使用
过滤器(在%c(“S”,“b”)中的字符%
要仅获取
摘要之后或之前的行,在测试程序时,我注意到它工作不正常,即当您输入较长的文本时,列不会从以下文本行的第一行开始计数。
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 = ","))
}
char_ind_count("<path_to_file>/extract_index_cols.txt")
char_ind_count(textConnection(text1)) 
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"