替换循环申请或傻瓜?

时间:2017-12-11 14:41:15

标签: r for-loop dataframe apply sapply

我有一个程序,但是我需要替换loop for apply或sapply?在我的情况下,这可能吗?你能救我吗?

我的代码

TD = stri_read_lines("script.R")

chars = data.frame()
for(i in 1:length(TD)){
  if(TD[i] !='') {  
    char= unlist(strsplit(TD[i], split=""))
        for ( j in 1:nchar(TD[i]) ) {     
      chars =rbind(chars , data.frame(a=char[j], b=i, c= j))
   }
  }  
}

> dput(head(TD))
"data.frame()"

结果

   a b  c
1  d 1  1
2  a 1  2
3  t 1  3
4  a 1  4
5  . 1  5
6  f 1  6
7  r 1  7
8  a 1  8
9  m 1  9
10 e 1 10
11 ( 1 11
12 ) 1 12

3 个答案:

答案 0 :(得分:4)

strsplit已经过矢量化,因此最好以这种方式使用它而不是循环。我将阅读我自己的一个脚本,因为我没有你的脚本。

library(stringi)

TD <- stri_read_lines("~/R/My Scripts/capitalize.R")
cat(TD[1:3], sep = "\n")
# capitalize_first <- function(x) {
#   # Capitalize the first word in each value of a character vector.
#   result <- as.character(x)

首先我们将删除空白行。

TD <- TD[TD != ""]

然后我们将创建一个列表,其中每个元素都是一行中字符的向量。我们还将得到每个的长度(即一行中的字符数)。

line_characters <- strsplit(TD, "")
line_lengths <- lengths(line_characters)

您想要的一列是单个向量中的所有字符。 unlist这样做。

all_characters <- unlist(line_characters)

另一列是每个角色来自的行号。使用rep,我们可以为序列中的每个字符重复序列1,2,...中的每个数字。

line_identifier <- rep(
  seq_along(line_characters),
  line_lengths
)

第三列是该行中字符的索引。再次使用line_lengths,我们可以创建一个序列列表,每个序列从1到其行的长度。然后unlist将它们折叠成一个向量。

index_in_line <- unlist(
  lapply(line_lengths, seq_len)
)

现在将它们组合在一个data.frame中。我还展示了数据穿过线的部分。

chars <- data.frame(
  a = all_characters,
  b = line_identifier,
  c = index_in_line
)

chars[21:40, ]
#    a b  c
# 21 f 1 21
# 22 u 1 22
# 23 n 1 23
# 24 c 1 24
# 25 t 1 25
# 26 i 1 26
# 27 o 1 27
# 28 n 1 28
# 29 ( 1 29
# 30 x 1 30
# 31 ) 1 31
# 32   1 32
# 33 { 1 33
# 34   2  1
# 35   2  2
# 36 # 2  3
# 37   2  4
# 38 C 2  5
# 39 a 2  6
# 40 p 2  7

答案 1 :(得分:3)

这是一个基础R的紧凑型解决方案:

TD <- c("data.frame()", "", "one more line")
L <- strsplit(TD, split="")
data.frame(a=unlist(L), b=rep(1:length(TD), nchar(TD)), c=sequence(nchar(TD)))

答案 2 :(得分:1)

使用lapply的简短回答。

data.frame(a = unlist(strsplit(TD, split = "")),
           b = rep(seq_along(TD), nchar(TD)),
           c = unlist(lapply(nchar(TD), seq_len)))