标签: lapply

为什么lapply()不保留我的data.table键?

我在列表中有一堆data.tables.我想应用于unique()我的列表中的每个data.table,但这样做会破坏我的所有data.table键.

这是一个例子:

A <- data.table(a = rep(c("a","b"), each = 3), b = runif(6), key = "a")
B <- data.table(x = runif(6), b = runif(6), key = "x")

blah <- unique(A)
Run Code Online (Sandbox Code Playgroud)

在这里,blah仍然有一把钥匙,世界上的一切都是正确的:

key(blah)

# [1] "a"
Run Code Online (Sandbox Code Playgroud)

但是,如果我将data.tables添加到列表并使用lapply(),则键将被销毁:

dt.list <- list(A, B)

unique.list <- lapply(dt.list, unique) # Keys destroyed here

lapply(unique.list, key) 

# [[1]]
# NULL

# [[2]]
# NULL
Run Code Online (Sandbox Code Playgroud)

这可能与我有关,并没有真正理解"通过引用"分配键意味着什么,因为我有其他问题,密钥消失了.

所以:

  • 为什么lapply不保留我的钥匙?
  • 说"按引用"分配密钥是什么意思?
  • 我是否应该将data.tables存储在列表中?
  • 如何安全地存储/操作data.tables而不用担心丢失我的密钥?

编辑:

对于它的价值,可怕的for循环也可以正常工作:

unique.list <- list()

for (i in …
Run Code Online (Sandbox Code Playgroud)

r lapply data.table

12
推荐指数
2
解决办法
444
查看次数

使用lapply更改数据框列表的列名

我试图在数据框列表上使用lapply ; 但没有正确传递参数(我认为).

数据框列表:

df1 <- data.frame(A = 1:10, B= 11:20)
df2 <- data.frame(A = 21:30, B = 31:40) 

listDF <- list(df1, df2,df3)    #multiple data frames w. way less columns than the length of vector todos
Run Code Online (Sandbox Code Playgroud)

矢量与列名称:

todos <-c('col1','col2', ......'colN')
Run Code Online (Sandbox Code Playgroud)

我想使用lapply更改列名:

lapply (listDF, function(x) { colnames(x)[2:length(x)] <-todos[1:length(x)-1] }  )
Run Code Online (Sandbox Code Playgroud)

但这根本不会改变名字.我不是自己传递数据帧,而是其他什么?我只想更改名称,而不是将结果返回给新对象.

在此先感谢,p.

r lapply dataframe

12
推荐指数
1
解决办法
2万
查看次数

如何让R的lapply(和mclapply)恢复随机数生成器的状态?

R忽略.Random.seed了lapply里面的设置.set.seed然而,使用工作正常.

一些代码:

# I can save the state of the RNG for a few seeds
seed.list <- lapply( 1:5, function(x) {
                        set.seed(x)
                        seed.state <- .Random.seed
                        print( rnorm(1) )
                        return( seed.state )}) 
#[1] -0.6264538
#[1] -0.8969145
#[1] -0.9619334

# But I get different numbers if I try to restore 
# the state of the RNG inside of an lapply
tmp.rest.state <-  lapply(1:5, function(x) { 
                        .Random.seed <- seed.list[[x]]
                        print(rnorm(1))})
# [1] -0.2925257
# [1] 0.2587882
# [1] -1.152132 …
Run Code Online (Sandbox Code Playgroud)

random r lapply mclapply

11
推荐指数
1
解决办法
836
查看次数

R:lapply函数 - 跳过当前函数循环

我在多个文件列表中使用lapply函数.有没有一种方法可以跳过当前文件上的函数而不返回任何内容,只是跳到文件列表中的下一个文件?

确切地说,我有一个检查条件的if语句,如果语句返回FALSE,我想跳到下一个文件.

r function lapply

11
推荐指数
2
解决办法
4092
查看次数

在R中替换第一次出现的":"而不是第二次

为了能够处理我想要替换:字符串中的第一个匹配项(这是我的标记,语音开始).

text <- c("Mr. Mark Francois (Rayleigh) (Con): If the scheme was so poorly targeted, why were the Government about to roll it out to employees in the Department of Trade and Industry and the Department for Work and Pensions on the very day the Treasury scrapped it? The CBI and the TUC have endorsed the scheme, which has helped 500,000 people and their families to improve their computer skills. When the Chancellor announced the original concession, he …
Run Code Online (Sandbox Code Playgroud)

regex r gsub lapply

11
推荐指数
1
解决办法
7147
查看次数

快速替代R分裂

我正在对数据帧进行分区split(),以便用于parLapply()并行调用每个分区上的函数.数据框有130万行和20列.我正在拆分/分区两列,都是字符类型.看起来有~47K唯一ID和~12K唯一代码,但不是每个ID和代码配对都匹配.得到的分区数量约为250K.这是split()一行:

 system.time(pop_part <- split(pop, list(pop$ID, pop$code)))
Run Code Online (Sandbox Code Playgroud)

然后将分区输入parLapply()如下:

cl <- makeCluster(detectCores())
system.time(par_pop <- parLapply(cl, pop_part, func))
stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)

我让split()代码单独运行差不多一个小时就完成了.我可以单独拆分ID,大约需要10分钟.此外,R studio和工作线程消耗约6GB的RAM.

我知道得到的分区数量的原因是我在Pentaho数据集成(PDI)中有相同的代码,它在30秒内运行(对于整个程序,而不仅仅是"拆分"代码).我并不希望R具有这种性能,但最坏的情况可能在10-15分钟内完成.

主要问题:是否有更好的替代分裂?我也尝试ddply().parallel = TRUE,但它也运行了一个多小时,从未完成.

split r pentaho lapply

10
推荐指数
2
解决办法
5984
查看次数

apply,sapply和lappy返回NULL

我有一个矩阵:

mat <- matrix(c(0,0,0,0,1,1,1,1,-1,-1,-1,-1), ncol = 4 , nrow = 4)
Run Code Online (Sandbox Code Playgroud)

并且我应用以下函数来过滤掉只有正条目的列,但是对于具有负条目的列,我得到了一个NULL.如何NULL从输出中抑制s lapply,applysapply

> lapply(as.data.frame(mat), function(x) { if( all(x >= 0) ){return(x)} })
$V1
[1] 0 0 0 0

$V2
[1] 1 1 1 1

$V3
NULL

$V4
[1] 0 0 0 0

> sapply(as.data.frame(mat), function(x) { if( all(x >= 0) ){return(x)} })
$V1
[1] 0 0 0 0

$V2
[1] 1 1 1 1

$V3
NULL

$V4
[1] 0 0 …
Run Code Online (Sandbox Code Playgroud)

r apply lapply sapply

10
推荐指数
2
解决办法
1863
查看次数

如何使用lapply()获取列表中每个元素的名称?

想象一下,我有以下列表

> test <- list("a" = 1, "b" = 2)
Run Code Online (Sandbox Code Playgroud)

列表的每个元素都有一个名称:

> names(test)
Run Code Online (Sandbox Code Playgroud)

现在,我想使用提取该名称,lapply()因为我想在一个将使用lapply调用的新函数中使用它.我只是不知道如何提取每个元素的名称.

我已经尝试使用deparse()substitute(),但结果是怪异:

> lapply(test, function(x) {deparse(substitute(x))})
$a
[1] "X[[i]]"

$b
[1] "X[[i]]"
Run Code Online (Sandbox Code Playgroud)

有人有线索吗?

精度:

我想做这样的事情:我有一个类似于测试的列表:

> test <- list("a" = matrix(1, ncol = 3), "b" = matrix(2, ncol = 3))
Run Code Online (Sandbox Code Playgroud)

我想将一个函数应用于该列表,该函数转换每个元素中的数据并为每列提供特定的名称:

make_df <- function(x) {
  output <- data.frame(x)
  names(output) <- c("items", "type", NAME_OF_X)
  return(output)
}
lapply(test, make_df)
Run Code Online (Sandbox Code Playgroud)

预期的产出是:

> test
$a
     [,1] [,2] [,3]
[1,]    1    1    1
attr(,"names")
[1] "index" …
Run Code Online (Sandbox Code Playgroud)

r lapply

10
推荐指数
2
解决办法
2万
查看次数

使用`weights`参数在`lapply`中调用`lm`时出错

lmlapply使用weights参数调用时,我遇到了一种奇怪的行为.

我的代码包含一个公式列表,我在其中运行一个我调用的线性模型lapply.到目前为止,它正在运作:

dd <- data.frame(y = rnorm(100),
                 x1 = rnorm(100),
                 x2 = rnorm(100),
                 x3 = rnorm(100),
                 x4 = rnorm(100),
                 wg = runif(100,1,100))

ls.form <- list(
  formula(y~x1+x2),
  formula(y~x3+x4),
  formula(y~x1|x2|x3),
  formula(y~x1+x2+x3+x4)
)

res.no.wg <- lapply(ls.form, lm, data = dd)
Run Code Online (Sandbox Code Playgroud)

但是,当我添加weights参数时,我得到一个奇怪的错误:

res.with.wg <- lapply(ls.form, lm, data = dd, weights = dd[,"wg"])
Error in eval(extras, data, env) : 
  ..2 used in an incorrect context, no ... to look in
Run Code Online (Sandbox Code Playgroud)

这就像如果...lapply与被发生冲突... …

r lapply lm

10
推荐指数
2
解决办法
380
查看次数

在R dplyr中为什么我需要在count()之后取消组合()?

当我第一次开始在RI中编程时,通常会使用dplyr count().

library(tidyverse)    
mtcars %>% count(cyl)
Run Code Online (Sandbox Code Playgroud)

一旦我开始使用apply函数,我开始遇到count()的问题.如果我简单地将ungroup()添加到我的计数结束(),那么问题就会消失.

我没有任何特别的可复制品来展示.但有人可以解释问题可能是什么,为什么ungroup()总是修复它,并且在每次count()之后或者在任何group_by()之后一直使用ungroup()有任何缺点吗?当然,我假设我不再需要在计算或汇总后对数据进行分组.

mtcars %>% count(cyl) %>% ungroup()
Run Code Online (Sandbox Code Playgroud)

group-by r lapply sapply dplyr

10
推荐指数
1
解决办法
1177
查看次数

标签 统计

lapply ×10

r ×10

sapply ×2

apply ×1

data.table ×1

dataframe ×1

dplyr ×1

function ×1

group-by ×1

gsub ×1

lm ×1

mclapply ×1

pentaho ×1

random ×1

regex ×1

split ×1