当我需要过滤data.frame,即提取满足特定条件的行时,我更喜欢使用该subset函数:
subset(airquality, Month == 8 & Temp > 90)
Run Code Online (Sandbox Code Playgroud)
而不是[功能:
airquality[airquality$Month == 8 & airquality$Temp > 90, ]
Run Code Online (Sandbox Code Playgroud)
我偏好有两个主要原因:
我发现代码从左到右读得更好.甚至那些对R一无所知的人也可以说出subset上面的陈述是做什么的.
因为列可以在select表达式中称为变量,所以我可以节省一些键击.在我上面的例子中,我只需输入airquality一次subset,但只输入三次[.
所以我过着幸福快乐,subset随处可见,因为它更短,读起来更好,甚至为我的R编码员提倡它的美丽.但昨天我的世界崩溃了.在阅读subset文档时,我注意到这一节:
警告
这是一种便于交互使用的便利功能.对于编程,最好使用像[的标准子集函数,特别是参数子集的非标准评估可能会产生意想不到的后果.
有人可以帮助澄清作者的意思吗?
首先,他们的意思是" 交互使用 "?我知道什么是交互式会话,而不是在BATCH模式下运行的脚本,但我不知道它应该有什么区别.
那么,请你解释一下" 论证子集的非标准评估 "以及为什么它是危险的,或许可以提供一个例子?
data.table x鉴于列名称的字符向量,我想重新排序我的列neworder:
library(data.table)
x <- data.table(a = 1:3, b = 3:1, c = runif(3))
neworder <- c("c", "b", "a")
Run Code Online (Sandbox Code Playgroud)
显然我可以这样做:
x[ , neworder, with = FALSE]
# or
x[ , ..neworder]
# c b a
# 1: 0.8476623 3 1
# 2: 0.4787768 2 2
# 3: 0.3570803 1 3
Run Code Online (Sandbox Code Playgroud)
但这需要再次复制整个数据集.还有另一种方法吗?
假设我们有以下数据框:
> df
A B C
1 1 2 3
2 4 5 6
3 7 8 9
Run Code Online (Sandbox Code Playgroud)
我们可以从索引中选择列'B':
> df[,2]
[1] 2 5 8
Run Code Online (Sandbox Code Playgroud)
有没有办法从列标签('B')获取索引(2)?
对于具有n列的data.frame ,我希望能够将列从1-(n-1)个位置中的任何一个移动到第n列(即非最后一列是最后一列).我也想用它来做dplyr.我想这样做,而不是简单地输入所有列的名称.
例如:
data<-data.frame(a=1:5, b=6:10, c=11:15)
Run Code Online (Sandbox Code Playgroud)
这有效,但不是dplyr这样的:
data[,c(colnames(data)[colnames(data)!='b'],'b')]
Run Code Online (Sandbox Code Playgroud)
这是首先dplyr创建列的方法b:
data%>%select(b, everything())
Run Code Online (Sandbox Code Playgroud)
但这不能使列b最后:
data%>%select(everything(), b)
Run Code Online (Sandbox Code Playgroud)
这有效,但要求我输入所有列:
data%>%select(a,c,b)
Run Code Online (Sandbox Code Playgroud)
那么有一种优雅的dplyr方式来做到这一点吗?
相关问题:
caught segfault每次我尝试从ggplot2包(1.0.0)运行任何绘图函数时,我都会收到错误.我有试过这个qplot,geom_dotplot,geom_histogram,从包装等数据(例如diamonds或economics)工作得很好.
我在Mac OS 10.9.4(最新版本)和R 3.1.1(也是最新版本)上运行.我从标准的R GUI,RStudio和从命令行使用R时得到了同样的错误.该命令将显示默认图形设备(Quartz for R GUI和命令行),但也会显示终端错误.
library(ggplot2)
qplot(1:10)
Run Code Online (Sandbox Code Playgroud)
给我错误:
*** caught segfault ***
address 0x18, cause 'memory not mapped'
Traceback:
1: .Call("plyr_split_indices", PACKAGE = "plyr", group, n)
2: split_indices(scale_id, n)
3: scale_apply(layer_data, x_vars, scale_train, SCALE_X, panel$x_scales)
4: train_position(panel, data, scale_x(), scale_y())
5: ggplot_build(x)
6: print.ggplot(list(data = list(), layers = list(<environment>), scales = <S4 object of class "Scales">, mapping = list(x = 1:3), theme …Run Code Online (Sandbox Code Playgroud) 如何在列中置换列data.table?我可以为a做data.frame,但data.table覆盖方法:
> df <- data.frame(a=1:3,b=4:6)
> df
a b
1 1 4
2 2 5
3 3 6
> df[c("b","a")]
b a
1 4 1
2 5 2
3 6 3
> dt <- as.data.table(df)
> dt
a b
1: 1 4
2: 2 5
3: 3 6
> dt[c("b","a")]
Error in `[.data.table`(dt, c("b", "a")) :
When i is a data.table (or character vector), x must be keyed (i.e. sorted, and, marked as sorted) …Run Code Online (Sandbox Code Playgroud) 我确信有人已经以其他方式问过这个问题,但我找不到它。
我想更改向量中特定值的位置。在下面的示例中,我将“第八”放在位置 4 中。
vector<-c("one","two","three","four","five","six","seven","eight","nine","ten")
vector
# [1] "one" "two" "three" "four" "five" "six" "seven" "eight" "nine" "ten"
vector<-vector[c(1:3,8,4:7,9:10)]
vector
# [1] "one" "two" "three" "eight" "four" "five" "six" "seven" "nine" "ten"
Run Code Online (Sandbox Code Playgroud)
当操作频繁进行时,就会变得很累。我想以一种非常高效和优雅的方式来做到这一点。
相关帖子的回复提供了一个有用的功能,可以重新排列数据框中的列顺序,但一般不适用于向量。对于向量来说,这样的东西会非常好:
arrange.vect(vector, c("eigth"=4))
# [1] "one" "two" "three" "eight" "four" "five" "six" "seven" "nine" "ten"
Run Code Online (Sandbox Code Playgroud)
是否有任何函数可以在某处执行此操作,或者有任何想法可以非常轻松地执行此操作?
我正在使用下面的代码生成一个简单的汇总表:
# Data
data("mtcars")
# Lib
require(dplyr)
# Summary
mt_sum <- mtcars %>%
group_by(am) %>%
summarise_each(funs(min, mean, median, max), mpg, cyl) %>%
mutate(am = as.character(am)) %>%
left_join(y = as.data.frame(table(mtcars$am),
stringsAsFactors = FALSE),
by = c("am" = "Var1"))
Run Code Online (Sandbox Code Playgroud)
代码产生了预期的结果:
> head(mt_sum)
Source: local data frame [2 x 10]
am mpg_min cyl_min mpg_mean cyl_mean mpg_median cyl_median mpg_max cyl_max Freq
(chr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (int)
1 0 10.4 4 17.14737 6.947368 17.3 8 24.4 8 19
2 1 …Run Code Online (Sandbox Code Playgroud)