假设我们有一个嵌套列表:
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()不是那么糟糕.
或者更为一般,它是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(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)的数据表确实有效,但这对我来说是最后的选择.我不想用单独的数据文件膨胀文件结构.另外,考虑打开这两个文件以使其工作的可怕要求.
提前致谢.
想法是比较两个字符串向量,例如:
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)