我想将一个函数应用于数据帧的每一行.使用apply,结果本身不再是数据框,它看起来更像是列表或矩阵?(我不知道足够的R能够从输出中得知,只是它不是数据帧)
哪个是用于将函数应用于数据帧的每一行,返回新数据帧的正确函数?
我想要应用于每一行的功能:
map_uri <- function(request){
ret <- request
uri_stem <- uri_map[uri_map[,1] == request["cs-uri-query"],2]
if(length(uri_stem) > 0){
ret <- request
ret["cs-uri-stem"] <- uri_stem
ret["cs-uri-query"] <- "-"
}
if(request["cs-uri-stem"] == "/index.html"){
ret["cs-uri-stem"] = "/"
}
return(ret)
}
Run Code Online (Sandbox Code Playgroud)
我在想什么:
cleansed <- apply(requests, 1, map_uri)
cleansed[,c("cs-uri-query", "cs-uri-stem")]
Run Code Online (Sandbox Code Playgroud)
这给了我错误
Fehler in cleansed [,c("cs-uri-stem","cs-uri-query")]:IndizierungaußerhalbderGrenzen
(指数超出界限)
由于某种原因,结构的变化使得上面的索引错误.
[编辑]
数据使这成为一个工作的例子:
uri_map.tsv http://pastebin.com/XhUuTMqA
uri_map <- read.table("http://pastebin.com/raw/XhUuTMqA", sep="\t", header=FALSE)
Run Code Online (Sandbox Code Playgroud)
并为转换函数输入数据:
请求< - read.table(" http://pastebin.com/raw/b7ja4rKn ",sep ="",header = TRUE)
Vin*_*mme 19
你可以使用申请家庭但是,你是对的,结果是a matrix或data.frame.虽然要回到一个不是什么大不了的事data.frame.
你的函数需要在列之间返回一致的东西(原始iris而不是在iris[, 1:4]下面不起作用,因为iris$Species这是一个具有3个级别的因子,其中summary返回6来自数字列的数字),并且这是可重现的有用的地方.下面,我使用iris和summary:
as.data.frame(apply(iris[, 1:4], 2, summary))as.data.frame(sapply(iris[, 1:4], summary))do.call(cbind, lapply(iris[, 1:4], summary))| 归档时间: |
|
| 查看次数: |
13019 次 |
| 最近记录: |