我想对数据框的每一行应用一个函数。使用apply,结果本身就不是一个数据框了,它看起来更像一个列表或矩阵?(我不知道足够的R来判断我得到的输出,只是它不是一个数据框)
哪一个是正确的函数,用于将函数应用于 Dataframe 的每一行,返回一个新的 Dataframe ?
我想应用于每一行的函数:
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)
}
字符串
我正在尝试:
cleansed <- apply(requests, 1, map_uri)
cleansed[,c("cs-uri-query", "cs-uri-stem")]
型
这就给了我一个错误
Fehler in cleansed[,c(“cs-uri-stem”,“cs-uri-query”)]:Indizierung außerhalb der Grenzen
(索引越界)
由于某种原因,结构的变化使上述索引错误。
[编辑]
数据使这成为一个工作示例:
uri_map.tsv http://pastebin.com/XhUuTMqA
uri_map <- read.table("http://pastebin.com/raw/XhUuTMqA", sep="\t", header=FALSE)
型
并为转换函数输入数据:
http://pastebin.com/b7ja4rKn的
requests <- read.table(“http://pastebin.com/raw/b7ja4rKn“,sep=”“,header=TRUE)
3条答案
按热度按时间4xy9mtcn1#
你可以使用apply family,但是,你是对的,结果要么是
matrix
,要么是list
。不过回到data.frame
也没什么大不了的。你的函数需要在列之间返回一致的东西(raw
iris
而不是iris[, 1:4]
在下面不起作用,因为iris$Species
是一个有3个级别的因子,其中summary
从数值列返回6个数值),这就是可重现的地方。下面,我使用了iris
和summary
:1.申请:
as.data.frame(apply(iris[, 1:4], 2, summary))
1.sapply:
as.data.frame(sapply(iris[, 1:4], summary))
1.lapply:
do.call(cbind, lapply(iris[, 1:4], summary))
yacmzcpb2#
我刚刚实现了这个函数,它将
FUN
应用于作为列表的行,并将结果连接到tibble
:字符串
df
被purrr::transpose(df)
转换为列表的列表,其中每个子列表是原始df
的一行。FUN
必须返回命名列表,它也可以包含长度不为1的元素。这些元素然后被 Package 在list()
中(类似data.frame
的对象的列类型也可以是列表)。如果return_tibble
是FALSE
,则结果被强制为data.frame
,并设置原始行名称。范例:
返回
data.frame
的示例:(you可以看到
tibble
更好地处理了<list>
列)kzipqqlq3#
使用dapr 1.0+,你可以在每行
rowwise()
上应用一个函数:字符串
如果你的函数已经被向量化了(就像这个例子中的
+
),你不需要rowwise()
:型
如果函数返回多个值,
summarize()
可以将这些值解压缩到单独的列中。