有一个数据框,让我们说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)
}
}
}
请帮我解决这个问题
答案 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))