asd <- data.frame(a = c("A","B"), b = c("d","f"), c = c("x","y"))
asd
a b c
1 A d x
2 B f y
a b c
1 A Ad Ax
2 B Bf By
您可以将paste0
与第一列asd[[1]]
和未列出的其他列unlist(asd[-1])
一起使用,并将其分配回data.frame
中,以代替其他列asd[-1]
。
asd[-1] <- paste0(asd[[1]], unlist(asd[-1]))
# a b c
#1 A Ad Ax
#2 B Bf By
禁用recursive
和use.names
中的unlist
可能会提高性能:
asd[-1] <- paste0(asd[[1]], unlist(asd[-1], FALSE, FALSE))
相同但使用名称:
S <- c("b", "c")
asd[S] <- paste0(asd$a, unlist(asd[S]))
asd[-1] <- Map(paste0, asd[rep(1,2)], asd[-1])
S <- c("b", "c")
asd[S] <- Map(paste0, asd[rep("a", length(S))], asd[S])
for(i in 2:3) {asd[[i]] <- paste0(asd[[1]], asd[[i]])}
for(i in c("b", "c")) {asd[[i]] <- paste0(asd$a, asd[[i]])}
getDf <- function(nr, nc) { #function to creat example dataset
data.frame(a = sample(LETTERS, nr, TRUE),
setNames(replicate(nc, sample(letters, nr, TRUE), simplify=FALSE), paste0("b", seq_len(nc))))
}
library(dplyr)
library(stringr)
library(purrr)
M <- alist(
unlist = (function(asd) {asd[,-1] <- paste0(asd[,1], unlist(asd[,-1], FALSE, FALSE)); asd})(D)
, Map = (function(asd) {asd[-1] <- Map(paste0, asd[rep(1,ncol(asd)-1)], asd[-1]); asd})(D)
, "for" = (function(asd) {for(i in 2:ncol(asd)) {asd[[i]] <- paste0(asd[,1], asd[,i])}; asd})(D)
, "for+str_c" = (function(asd) {for(i in 2:ncol(asd)) {asd[[i]] <- str_c(asd[,1], asd[,i])}; asd})(D)
, lapply = (function(asd) {asd[-1] <- lapply(asd[-1], function(x) paste0(asd$a, x)); asd})(D)
, across = (function(asd) {asd <- asd %>% mutate(across(-a, ~str_c(a, .x))); asd})(D)
, pmap = (function(asd) {asd <- asd %>%
pmap_dfr(~ c(list(...)[1], setNames(paste(..1, c(...)[-1], sep = ""), names(asd)[-1]))); as.data.frame(asd)})(D)
, "row+matrix" = (function(asd) {asd[-1] <- paste0(asd$a[row(asd[-1])], as.matrix(asd[-1])); asd})(D)
, apply = (function(asd) {asd[-1] <- apply(asd[-1], 2, function(x) paste0(asd[[1]], x)); asd})(D)
)
D <- getDf(1e5,2) #1e5 rows and 2 columsn
bench::mark(exprs = M)
# expression min median `itr/sec` mem_alloc `gc/sec` n_itr n_gc total_time
# <bch:expr> <bch:t> <bch:t> <dbl> <bch:byt> <dbl> <int> <dbl> <bch:tm>
#1 unlist 29.07ms 29.92ms 29.5 12.68MB 11.8 15 6 509ms
#2 Map 22.94ms 23.02ms 42.6 1.53MB 1.94 22 1 516.38ms
#3 for 22.84ms 22.96ms 42.8 1.53MB 1.94 22 1 514.15ms
#4 for+str_c 9.78ms 10ms 97.2 1.53MB 3.97 49 2 503.89ms
#5 lapply 22.89ms 23.01ms 42.7 1.53MB 1.94 22 1 514.82ms
#6 across 12.29ms 12.57ms 77.8 1.53MB 1.99 39 1 501.43ms
#7 pmap 2.95s 2.95s 0.339 9.54MB 6.45 1 19 2.95s
#8 row+matrix 30.64ms 32.65ms 19.8 14.97MB 6.09 13 4 656.35ms
#9 apply 32.93ms 34.12ms 27.7 19.55MB 5.94 14 3 504.85ms
#Warning message:
#Some expressions had a GC in every iteration; so filtering is disabled.
D <- getDf(1e2, 1e3)
bench::mark(exprs = M)
# expression min median `itr/sec` mem_alloc `gc/sec` n_itr n_gc total_time
# <bch:expr> <bch:t> <bch:t> <dbl> <bch:byt> <dbl> <int> <dbl> <bch:tm>
#1 unlist 21.4ms 21.7ms 45.2 18.08MB 9.68 14 3 310ms
#2 Map 28ms 28.1ms 35.3 12.53MB 4.41 16 2 453ms
#3 for 39.3ms 39.4ms 25.4 8.5MB 2.11 12 1 473ms
#4 for+str_c 34.1ms 34.3ms 29.1 8.5MB 4.48 13 2 447ms
#5 lapply 21.9ms 22.1ms 44.7 12.48MB 7.46 18 3 402ms
#6 across 80.3ms 80.9ms 12.3 5.98MB 4.93 5 2 406ms
#7 pmap 113.9ms 114ms 8.74 17.5MB 5.83 3 2 343ms
#8 row+matrix 24.5ms 24.6ms 40.2 19.31MB 10.7 15 4 373ms
#9 apply 32.3ms 32.5ms 30.5 21.72MB 11.1 11 4 360ms
输入的dput() 结构(列表(Varname=structure(1:6,.标签=c(“A”,“B”,“c”,“D”,“E”,“F”),类=“因子”),成分=结构(c(3L,1L,1L,4L,2L,1L),标签=c(“”,“A,c”,“B”,“c”),类=“因子”),名字=结构(c(5L,3L,2L,4L,6L),标签=c(“”,“鲍勃”,“凯茜”,“迪克,南希”,“杰克,布鲁斯”,“曼迪”),
为此,我尝试使用lapply和一个自定义函数: 我知道我可以用一堆联合声明来做到这一点,或者也许有一种方法可以用循环和联合来做到这一点。但是考虑到需要遍历的列数,我想尝试用一种更优雅的方式来完成它。
我有一些数据,其中每个id由不同的类型测量,这些类型可以有不同的值。测量值为val。一个小的虚拟数据如下所示: 那么df是: 我需要传播/投射数据,以便每个id的
我有一个不同长度的数据帧列表(df),按年份索引,数据的代理如下所示:
我试图在R中合并2个数据帧,但我有两个不同的列,带有不同类型的ID变量。有时一行会有其中一列的值,而另一列却没有。我想同时考虑它们,这样,如果一个帧缺少一个列的值,那么将使用另一个列。 我想合并这两个数据帧,得到2行: null 编辑:理想情况下,输出如下所示: 第1行匹配,因为列“first”在两个数据帧中具有相同的值,并且它填充了来自DF2的“second”的值 第2行匹配,因为列“secon
我正在尝试计算多个列的中值,但是我的数据有点奇怪。它看起来像下面的示例。 在表中到列表示该值的出现次数。我想计算中位数的出现次数。 例如对于ID = 1 是我想要创建的计算。 对于ID=2 我尝试过使用<code>rep()或<code>rep(10,2)),这就是我所期望的。我只是努力创建一个列表或向量,每个列都有重复。