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

时间:2017-12-01 18:04:52

标签: r

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

作为一个例子,我使用了一个名为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

2 个答案:

答案 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"