相关疑难解决方法(0)

为什么`[`比`子集更好?

当我需要过滤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)

我偏好有两个主要原因:

  1. 我发现代码从左到右读得更好.甚至那些对R一无所知的人也可以说出subset上面的陈述是做什么的.

  2. 因为列可以在select表达式中称为变量,所以我可以节省一些键击.在我上面的例子中,我只需输入airquality一次subset,但只输入三次[.

所以我过着幸福快乐,subset随处可见,因为它更短,读起来更好,甚至为我的R编码员提倡它的美丽.但昨天我的世界崩溃了.在阅读subset文档时,我注意到这一节:

警告

这是一种便于交互使用的便利功能.对于编程,最好使用像[的标准子集函数,特别是参数子集的非标准评估可能会产生意想不到的后果.

有人可以帮助澄清作者的意思吗?

首先,他们的意思是" 交互使用 "?我知道什么是交互式会话,而不是在BATCH模式下运行的脚本,但我不知道它应该有什么区别.

那么,请你解释一下" 论证子集的非标准评估 "以及为什么它是危险的,或许可以提供一个例子?

r subset filter r-faq

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

如何重新排序data.table列(无需复制)

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)

但这需要再次复制整个数据集.还有另一种方法吗?

r data.table

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

从数据框中的标签获取列索引

假设我们有以下数据框:

> 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)?

r

69
推荐指数
4
解决办法
15万
查看次数

R使用dplyr将列移动到最后

对于具有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方式来做到这一点吗?

相关问题:

r dplyr

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

在R中发现了段错误

caught segfault每次我尝试从ggplot2包(1.0.0)运行任何绘图函数时,我都会收到错误.我有试过这个qplot,geom_dotplot,geom_histogram,从包装等数据(例如diamondseconomics)工作得很好.

我在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)

r

30
推荐指数
1
解决办法
3万
查看次数

如何重新排序data.table列?

如何在列中置换列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)

r data.table

16
推荐指数
1
解决办法
9624
查看次数

更改向量中特定值的位置

我确信有人已经以其他方式问过这个问题,但我找不到它。

我想更改向量中特定值的位置。在下面的示例中,我将“第八”放在位置 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)

是否有任何函数可以在某处执行此操作,或者有任何想法可以非常轻松地执行此操作?

r vector

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

4
推荐指数
1
解决办法
5305
查看次数

通过传递带有列名的有序向量来动态排序dplyr中的列以进行选择

我正在使用下面的代码生成一个简单的汇总表:

# 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)

sorting r dataframe dplyr

3
推荐指数
2
解决办法
1243
查看次数

标签 统计

r ×9

dplyr ×3

data.table ×2

dataframe ×2

filter ×1

r-faq ×1

sorting ×1

subset ×1

vector ×1