小编sta*_*ace的帖子

R:替换嵌套列表中的值

假设我们有一个嵌套列表:

test <- list(
  list(a = 1, b = 2, c = NULL),
  list(a = NULL, b = 2, c = 3))
Run Code Online (Sandbox Code Playgroud)

如何替换所有NULL值,比如NA保留数据结构?因此,当我尝试将数据框从列表中删除时,我最终不会丢失值/结构.如:

data.frame(matrix(unlist(test), nrow = 2, byrow = T))

  X1 X2
1  1  2
2  2  3
Run Code Online (Sandbox Code Playgroud)

期望的输出是这样的:

   X1 X2 X3
1  1  2  NA
2  NA 2  3
Run Code Online (Sandbox Code Playgroud)

有建议这样做:

rbind.fill(lapply(test, function(f) {
  as.data.frame(Filter(Negate(is.null), f))
}))
Run Code Online (Sandbox Code Playgroud)

这不像我想的那样矢量化.显然尺寸和性能是一个问题.弹出的一个解决方法是替换所有NULL值,就像一次完成整个数据帧一样.然后unlist()matrix()列表.

我不确定性能的好坏(如果有的话).也许好老lapply()不是那么糟糕.

r

8
推荐指数
1
解决办法
2295
查看次数

R:data.table与merge(aggregate())性能

或者更为一般,它是DT[,.SD[...],by=...]对抗merge(aggregate(...)).

不用多说了,这里有数据和示例:

set.seed(5141)
size = 1e6
df <- data.table(a = rnorm(size),
                 b = paste0(sample(letters, size, T), 
                            sample(letters, size, T), 
                            sample(letters, size, T)),
                 c = sample(1:(size/10), size, T),
                 d = sample(seq.Date(as.Date("2015-01-01"), 
                                     as.Date("2015-05-31"), by="day"), size, T))

system.time(df[,.SD[d == max(d)], by = c])
# user  system elapsed 
# 50.89    0.00   51.00 
system.time(merge(aggregate(d ~ c, data = df, max), df))
# user  system elapsed 
# 18.24    0.20   18.45 
Run Code Online (Sandbox Code Playgroud)

通常对data.table性能没有任何问题,我对这个特殊的例子感到惊讶.我不得不通过仅采用某些事件类型的最新(可以同时)出现来对一个相当大的数据帧进行子集(聚合).并保留这些特定事件的其余相关数据.但是,似乎.SD在这个特定应用中不能很好地扩展.

是否有更好的"数据表方式"来处理这类任务?

r data.table

6
推荐指数
1
解决办法
534
查看次数

将数据从R导出到Excel:公式不会重新计算

R(3.0.2)/ MSOffice 2013/Win7

假设我们有一个包含两个表的现有data.xlsx文件 - "data"和"calc".

"数据"表通过R填写:

require(XLConnect)
df <- data.frame(c(1,2,3,4,5), c(2,3,4,5,6))
wb <- loadWorkbook("data.xlsx", create=F)
setStyleAction(wb, type=XLC$"STYLE_ACTION.NONE")
writeWorksheet(wb, data=df, sheet="data", startRow=1, startCol=1, header=F)
saveWorkbook(wb)
Run Code Online (Sandbox Code Playgroud)

所以这就出现了问题 - 我有"calc"表,它引用了带有公式的"数据"表.由于某些原因,即使公式引用刚刚填充的单元格,也不会重新计算更新数据.

Excel中的计算选项变为自动,甚至将其转为手动,按F9强制重新计算不起作用.

我找到了一些奇怪的方法来完成这项工作:1.选择具有适当公式的特定单元格并按Enter键(对于每个单元格)2.再次将故障单元格上的公式拖动(用完全相同的公式覆盖公式) ..)3.参考其他文件(比如data2.xlsx)的数据表确实有效,但这对我来说是最后的选择.我不想用单独的数据文件膨胀文件结构.另外,考虑打开这两个文件以使其工作的可怕要求.

提前致谢.

excel r

5
推荐指数
1
解决办法
2772
查看次数

比较字符串向量和量化差异

想法是比较两个字符串向量,例如:

df <- data.frame(a = c("New York 001", "Orlando 002", "Boston 003", "Chicago 004", "Atlanta 005"),
                 b = c("NEW YORK  001", "Orlando", "Boston (003)", "Chicago 005", "005 Atlanta"))
Run Code Online (Sandbox Code Playgroud)

并想出一种方法来给他们一些精确度.基本上添加具有数值的列c.

我的思路:

我们有这个:

> df
             a             b
1 New York 001 NEW YORK  001
2  Orlando 002       Orlando
3   Boston 003  Boston (003)
4  Chicago 004   Chicago 005
5  Atlanta 005   005 Atlanta
Run Code Online (Sandbox Code Playgroud)

第一件事是第一件事 - 剥离白人,忽略案件并删除所有特殊字符.

df$a <- gsub("[[:space:]]|[[:punct:]]", "", toupper(df$a))
df$b <- gsub("[[:space:]]|[[:punct:]]", "", toupper(df$b))
Run Code Online (Sandbox Code Playgroud)

我们得到了什么:

> df
           a          b
1 …
Run Code Online (Sandbox Code Playgroud)

regex string r

4
推荐指数
2
解决办法
177
查看次数

标签 统计

r ×4

data.table ×1

excel ×1

regex ×1

string ×1