如何将substr函数用于多个变量并将其写入R中的csv文件?

时间:2017-05-05 13:01:32

标签: r csv

有一个数据框,让我们说mtcars,我想从不同的变量中提取不同的值,最后我想在R中形成一个CSV数据框。

数据

   mpg      cyl   disp  hp 
   21.0   6160.0  110   3.90 
   21.0   6160.0  110   3.90 
   22.8   4108.0  93    3.85 
   21.4   6258.0  110   3.08 
   18.7   8360.0  175   3.15 

所以从mpg变量我想提取前2个字母并从cyl我想提取前3个数字..... e.t.c,因为我有一个键如下

密钥文件

 header  startkey endkey
 mpg     0        2
 cyl     0        3
 disp    1        2
 hp      2        4

预期输出

   mpg  cyl   disp   hp 
   21   616   11    .90 
   21   616   11    .90 
   22   410   93    .85 
   21   625   11    .08 
   18   836   17    .15    

尝试:

vars = unique(as.character(keyfile$header))
start_keys = keyfile$startkey
end_keys = keyfile$endkey

for(i in 1:length(vars)){
for (j in 1:length(start_key)){
for(k in 1:length(end_key)){
data = substr(data$i,j,k)
filename = paste(deparse(substitute(output_data)), ".csv",sep="")
write.csv(data,file = filename)
}
}
}

请帮我解决这个问题

1 个答案:

答案 0 :(得分:1)

我们可以使用Map来提取数据中每列的子字符串'根据相应的'启动密钥',#end;'来自'密钥文件'

data[] <- Map(substr, data[keyfile$header], keyfile$startkey, keyfile$endkey)

如果我们想转换为numeric

data[] <- Map(function(...) as.numeric(substr(...)), 
               data[keyfile$header], keyfile$startkey, keyfile$endkey)
data
#  mpg cyl disp   hp
#1  21 616   11 0.90
#2  21 616   11 0.90
#3  22 410   93 0.85
#4  21 625   11 0.08
#5  18 836   17 0.15

数据

data <- structure(list(mpg = c(21, 21, 22.8, 21.4, 18.7), cyl = c(6160, 
6160, 4108, 6258, 8360), disp = c(110L, 110L, 93L, 110L, 175L
), hp = c(3.9, 3.9, 3.85, 3.08, 3.15)), .Names = c("mpg", "cyl", 
"disp", "hp"), class = "data.frame", row.names = c(NA, -5L))

keyfile <- structure(list(header = c("mpg", "cyl", "disp", "hp"), startkey = c(0L, 
0L, 1L, 2L), endkey = c(2L, 3L, 2L, 4L)), .Names = c("header", 
"startkey", "endkey"), class = "data.frame", row.names = c(NA, 
-4L))