有这样的情况.试图将"mtcars"类从data.frame转换为data.table.
"mtcars"数据:
> mtcars
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Run Code Online (Sandbox Code Playgroud)
原始类是"data.frame".
> str(mtcars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ …Run Code Online (Sandbox Code Playgroud) 我想将data.table管道与magrittr流水线混合.我可以从data.table转到%>%,但我无法弄清楚如何回到[] [] data.table样式的流水线.
这是一个例子:
> tbl = data.table(grp=c(1,1,1,2,2,2,3,3,3,4,4), y=rnorm(11))
> tbl
grp y
1: 1 0.08150
2: 1 1.51330
3: 1 -0.26154
4: 2 -0.12746
5: 2 0.10747
6: 2 0.16502
7: 3 0.54139
8: 3 -0.04194
9: 3 0.02373
10: 4 2.00756
11: 4 1.05523
> tbl[, .(.N, mean(y)), by=grp][order(-N)] %>% head(n=3) %>% .[, N := NULL]
grp V2
1: 1 0.44442
2: 2 0.04834
3: 3 0.17439
> tbl[, .(.N, mean(y)), by=grp][order(-N)] %>% head(n=3) %>% .[, N := …Run Code Online (Sandbox Code Playgroud) 我遇到了一个需要合并两个数据框的项目.他们看起来像这样:
Data1
Traffic Source Registrations Hour Minute
organic 1 6 13
social 1 8 54
Data2
Email Hour2 Minute2
test@domain.com 6 13
test2@domain2.com 8 55
Run Code Online (Sandbox Code Playgroud)
我有以下代码行来合并2个数据帧:
merge.df <- merge(Data1, Data2, by.x = c( "Hour", "Minute"),
by.y = c( "Hour2", "Minute2"))
Run Code Online (Sandbox Code Playgroud)
如果两个数据集之间的可变时间(小时和分钟)没有略微偏离,那将会很有效.有没有办法让列"分钟"与"Minute2"匹配,如果它是+或 - 一分钟关闭?
我以为我可以为数据集1创建2个新列:
Data1
Traffic Source Registrations Hour Minute Minute_plus1 Minute_minus1
organic 1 6 13 14 12
social 1 8 54 55 53
Run Code Online (Sandbox Code Playgroud)
如果"Minute2"匹配"Minute","Minute_plus1"或"Minute_minus1"中的任何变量,是否可以合并2个数据帧?或者是否有更有效的方法来完成此合并?
我有一个命名元素列表(testlist),其中一些名称是重复的
$x
[1] "one"
$x
[1] "two"
$y
[1] "three"
$y
[1] "four"
Run Code Online (Sandbox Code Playgroud)
我试图最终得到一个数据表,它将元素与通用名称组合到同一列中.
x y
1: one three
2: two four
Run Code Online (Sandbox Code Playgroud)
我试过了
testdf <- do.call(cbind, lapply(testlist, data.table))
Run Code Online (Sandbox Code Playgroud)
但最终只有:
x.V1 x.V1 y.V1 y.V1
1: one two three four
Run Code Online (Sandbox Code Playgroud)
有什么建议?感谢帮助!
我在hadley的功能指南中经历了一些例子,并遇到了意想不到的问题.
假设我有一个模型对象列表,
x=1:3;y=3:1; bah <- list(lm(x~y),lm(y~x))
Run Code Online (Sandbox Code Playgroud)
并希望从每个中提取一些东西(如hadley关于名为"试验"的列表的问题所示).我期待其中一个工作:
lapply(bah,`$`,i='call') # or...
lapply(bah,`$`,call)
Run Code Online (Sandbox Code Playgroud)
但是,这些返回null.好像我没有滥用这个$功能,因为这些东西有效:
`$`(bah[[1]],i='call')
`$`(bah[[1]],call)
Run Code Online (Sandbox Code Playgroud)
无论如何,我只是把它作为一个练习,我很好奇我的错误.我知道我可以使用匿名函数,但认为必须有一种方法来使用类似于我最初的非解决方案的语法.我已经看过了$所提到的地方?Extract,但没有看到任何明显的解释.
我才意识到这有效:
lapply(bah,`[[`,i='call')
Run Code Online (Sandbox Code Playgroud)
还有这个
lapply(bah,function(x)`$`(x,call))
Run Code Online (Sandbox Code Playgroud)
也许这只是归结为一些lapply需要匿名功能而不需要任何功能的伏都教?我觉得我以前在某个地方听说过.
注意:我在此问题中遇到的确切问题不适用于最新版本的数据表.如果你想做标题中描述的事情,请查看包FAQ中的相应问题,1.6确定,但我不提前知道这些表达式.我如何以编程方式传递它们?.
我已经看到一个答案,说明如何构建一个要进行评估的表达式
DT[,j=eval(expr)]
Run Code Online (Sandbox Code Playgroud)
我正在使用这个作业,```:=`(mycol = my_calculation)``,我想知道......
通过"动态",我的意思是"在我为我编写代码后确定expr".
编辑:为了更好地说明问题,这里是不同的例子.查看编辑历史记录以查看原始文件.
require(data.table)
require(plyr)
options(datatable.verbose=TRUE)
DT <- CJ(a=0:1,b=0:1,y=2)
# setup:
expr <- as.quoted(paste(expression(get(col_in_one)+get(col_in_two))))[[1]]
# usage:
col_in_one <- 'a'
col_in_two <- 'b'
col_out <- 'bah'
DT[,(col_out):=eval(expr)] # fails, should take the form j=eval(expr)
Run Code Online (Sandbox Code Playgroud)
我想将设置和使用阶段分开,因此我的代码更易于维护.我的真实表达比这个例子更麻烦(它只选择一列).
第一个问题:如何使分配到的列"col_out"动态化?我的意思是:我想动态指定"cols_in_*"和"col_out".
我尝试在"expr"中创建各种表达式,但as.quoted抛出一个错误,即不将某些东西放在=符号的左边.
第二个问题:如何避免使用警告
get?
警告建议使用.SDcols,以便[.data.table知道我正在使用哪些列.但是,如果我使用这个.SDcols参数,另一个警告说除非.SD正在使用,否则没有必要这样做.
我到目前为止的解决方案是......
# Ricardo + eddi:
expr2 …Run Code Online (Sandbox Code Playgroud) 我有一些月度数据,我想在我的数据框中添加一列,将第一列中的最小值与第一列中的最大值相关联.第一列中的第二个最小值到第一列中的第二个最大值,例如......
这是一些示例数据
x1<-c(100,151,109,59,161,104,170,101)
dat<-data.frame(x1)
rownames(dat)<-c('Apr','May', 'Jun','Jul', 'Aug', 'Sep', 'Oct', 'Nov')
x1
Apr 100
May 151
Jun 109
Jul 59
Aug 161
Sep 104
Oct 170
Nov 101
Run Code Online (Sandbox Code Playgroud)
我试图让我的数据看起来像这样
x1 x2
Apr 100 161
May 151 101
Jun 109 104
Jul 59 170
Aug 161 100
Sep 104 109
Oct 170 59
Nov 101 151
Run Code Online (Sandbox Code Playgroud)
我带着等级,排序和顺序进入圈子.任何帮助,将不胜感激.
ggplot2我从未真正开发的包中的一个非常酷的功能是在图中添加图层列表.有趣的是,我可以将一个图层列表作为参数传递给函数,并将它们添加到图中.然后,我可以获得所需的情节外观,而不必从功能中返回情节(这是否是一个好主意是另一回事,但它是可能的).
library(ggplot2)
x <- ggplot(mtcars,
aes(x = qsec,
y = mpg))
layers <- list(geom_point(),
geom_line(),
xlab("Quarter Mile Time"),
ylab("Fuel Efficiency"))
x + layers
Run Code Online (Sandbox Code Playgroud)
有没有办法用管道做到这一点?类似于:
#* Obviously isn't going to work
library(dplyr)
action <- list(group_by(am, gear),
summarise(mean = mean(mpg),
sd = sd(mpg)))
mtcars %>% action
Run Code Online (Sandbox Code Playgroud) 我有以下两个表:
df <- data.frame(eth = c("A","B","B","A","C"),ZIP1 = c(1,1,2,3,5))
Inc <- data.frame(ZIP2 = c(1,2,3,4,5,6,7),A = c(56,98,43,4,90,19,59), B = c(49,10,69,30,10,4,95),C = c(69,2,59,8,17,84,30))
eth ZIP1 ZIP2 A B C
A 1 1 56 49 69
B 1 2 98 10 2
B 2 3 43 69 59
A 3 4 4 30 8
C 5 5 90 10 17
6 19 4 84
7 59 95 39
Run Code Online (Sandbox Code Playgroud)
我想在df数据框中创建一个变量Inc,对于每个观察,该值是观察的eth和ZIP的交集.在我的例子中,它会导致:
eth ZIP1 Inc
A 1 56
B 1 49
B 2 10
A 3 43 …Run Code Online (Sandbox Code Playgroud) 我在R中有两个数据框,我需要逐行计算元素匹配,最后获得一个列,其中包含两个表的笛卡尔积的长度和两行的ID.此外,表格非常大,行数不同,但列数相同.
我有以下代码,但多次运行时速度很慢.
library(data.table)
table_1<-data.table(matrix(c(1:24),nrow = 4))
table_2<-data.table(matrix(c(11:34),nrow = 4))
names(table_1)<-c("s1", "s2","s3","s4","s5","s6")
names(table_2)<-c("a1","a2","a3","a4","a5","a6")
table_1$ID<-seq.int(nrow(table_1))
table_2$ID_ap<-seq.int(nrow(table_2))
setcolorder(table_1, c("ID", "s1", "s2","s3","s4","s5","s6"))
setcolorder(table_2, c("ID_ap","a1","a2","a3","a4","a5","a6"))
CJ.table<-function(X,Y) setkey(X[,c(k=1,.SD)],k)[Y[,c(k=1,.SD)],allow.cartesian=TRUE][,k:=NULL]
join<-CJ.table(table_1,table_2)
R<-subset(join, select=c("ID_ap","ID"))
R$Ac<- (join$s1 == join$a1) + (join$s1 ==join$a2) + (join$s1 ==join$a3) + (join$s1 ==join$a4) + (join$s1 ==join$a5) + (join$s1 ==join$a6)+
(join$s2 == join$a1) + (join$s2 ==join$a2) + (join$s2 ==join$a3) + (join$s2 ==join$a4) + (join$s2 ==join$a5) + (join$s2 ==join$a6)+
(join$s3 == join$a1) + (join$s3 ==join$a2) + (join$s3 ==join$a3) + (join$s3 ==join$a4) + (join$s3 ==join$a5) + (join$s3 ==join$a6)+ …Run Code Online (Sandbox Code Playgroud) r ×10
data.table ×5
dataframe ×4
magrittr ×2
dplyr ×1
ggplot2 ×1
lapply ×1
match ×1
merge ×1
optimization ×1
performance ×1