我有一个程序,但是我需要替换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
答案 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)))