I need to load many .csv and .xlsx(including two or three sheets) in one folder
files <- list.files(path = , pattern = "*.csv")
files <- list.files(path = , pattern = "*.xlsx")
for(i in files) { }
Can I use loop to load two different excel format at same time? Any ideas? Thank Everyone help!
CodePudding user response:
substring
not substr
is useful for these kind of vectorised substringing operations:
nc <- seq(nchar(A))
sum(as.numeric(substring(A, nc, nc)) * rev(nc))
#[1] 134
CodePudding user response:
A <- "883745"
First, when given this task, you need to break down the summation and look for pattern. In particular, pay attention to what is changing.
ans = as.numeric(substr(A , 1, 1)) * (nchar(A) - 0)
ans = as.numeric(substr(A , 2, 2)) * (nchar(A) - 1)
ans = as.numeric(substr(A , 3, 3)) * (nchar(A) - 2)
ans = as.numeric(substr(A , 4, 4)) * (nchar(A) - 3)
ans = as.numeric(substr(A , 5, 5)) * (nchar(A) - 4)
ans = as.numeric(substr(A , 6, 6)) * (nchar(A) - 5)
This can be summarized as:
ans = as.numeric(substr(A , i, i)) * (nchar(A) - i 1), i = 1, 2, ..., 6
Freshman
Loop as it is.
ans <- 0
for (i in 1:6) {
ans <- ans as.numeric(substr(A , i, i)) * (nchar(A) - i 1)
}
ans
#[1] 134
Sophomore
Pre-compute the result of substring
and nchar
, then index them in the loop.
N <- as.numeric(substring(A, 1:6, 1:6))
L <- nchar(A) - (1:6) 1
ans <- 0
for (i in 1:6) {
ans <- ans N[i] * L[i]
}
ans
#[1] 134
Junior
Replace the loop by sum
.
N <- as.numeric(substring(A, 1:6, 1:6))
L <- nchar(A) - (1:6) 1
ans <- sum(N * L)
ans
#[1] 134
Senior
Replace sum
by crossprod
.
N <- as.numeric(substring(A, 1:6, 1:6))
L <- nchar(A) - (1:6) 1
ans <- c(crossprod(N, L))
ans
#[1] 134
CodePudding user response:
Your code can be considerably simpler and no loop is necessary. This may be what you are trying to accomplish:
A <- 883745
len <- nchar(A)
N <- as.numeric(unlist(strsplit(as.character(A), "")))
N
# [1] 8 8 3 7 4 5
N * (len - 0:5)
# [1] 48 40 12 21 8 5
sum(N * (len - 0:5))
# [1] 134