当前位置: 首页 > 知识库问答 >
问题:

一次组合R数据frame中的列值

马胜泫
2023-03-14
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

共有1个答案

程智明
2023-03-14

您可以将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

禁用recursiveuse.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)),这就是我所期望的。我只是努力创建一个列表或向量,每个列都有重复。