小编flo*_*del的帖子

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

当我需要过滤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万
查看次数

为什么"vapply"比"sapply"更安全?

文件说

vapply类似于sapply,但具有预先指定的返回值类型,因此使用起来更安全.

你能详细说明为什么它通常更安全,可能提供例子吗?


PS:我知道答案,我已经倾向于避免sapply.我只希望在这里有一个很好的答案,所以我可以指出我的同事.请不要"阅读手册"的答案.

r apply r-faq

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

在函数中使用`...`(三点或点点)

我在哪里可以找到有关...函数用法的文档?例子很有用.

r ellipsis

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

创建一个data.frame,其中列是列表

我知道如何添加列表列:

> df <- data.frame(a=1:3)
> df$b <- list(1:1, 1:2, 1:3)
> df
  a       b
1 1       1
2 2    1, 2
3 3 1, 2, 3
Run Code Online (Sandbox Code Playgroud)

这有效,但不是:

> df <- data.frame(a=1:3, b=list(1:1, 1:2, 1:3))
Error in data.frame(1L, 1:2, 1:3, check.names = FALSE, stringsAsFactors = TRUE) : 
  arguments imply differing number of rows: 1, 2, 3
Run Code Online (Sandbox Code Playgroud)

为什么?

另外,有没有办法df在一次调用中创建(上面)data.frame

r list dataframe

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

data.table"关键指数"或"组计数器"

在data.table上创建密钥后:

set.seed(12345)
DT <- data.table(x = sample(LETTERS[1:3], 10, replace = TRUE),
                 y = sample(LETTERS[1:3], 10, replace = TRUE))
setkey(DT, x, y)
DT
#       x y
#  [1,] A B
#  [2,] A B
#  [3,] B B
#  [4,] B B
#  [5,] C A
#  [6,] C A
#  [7,] C A
#  [8,] C A
#  [9,] C C
# [10,] C C
Run Code Online (Sandbox Code Playgroud)

我想得到一个整数向量,为每一行提供相应的"密钥索引".我希望下面的预期输出(列i)有助于澄清我的意思:

#       x y i
#  [1,] A B 1
#  [2,] A …
Run Code Online (Sandbox Code Playgroud)

r data.table

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

ddply错误的含义:'names'属性[9]的长度必须与vector [1]的长度相同

我正在通过黑客机器学习,我被困在这一行:

from.weight <- ddply(priority.train, .(From.EMail), summarise, Freq = length(Subject))
Run Code Online (Sandbox Code Playgroud)

这会产生以下错误:

Error in attributes(out) <- attributes(col) : 
  'names' attribute [9] must be the same length as the vector [1]
Run Code Online (Sandbox Code Playgroud)

这是一个追溯():

> traceback()
11: FUN(1:5[[1L]], ...)
10: lapply(seq_len(n), extract_col_rows, df = x, i = i)
9: extract_rows(x$data, x$index[[i]])
8: `[[.indexed_df`(pieces, i)
7: pieces[[i]]
6: function (i) 
   {
       piece <- pieces[[i]]
       if (.inform) {
           res <- try(.fun(piece, ...))
           if (inherits(res, "try-error")) {
               piece <- paste(capture.output(print(piece)), collapse = "\n")
               stop("with piece ", i, ": …
Run Code Online (Sandbox Code Playgroud)

r plyr

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

"替换"功能示例

我没有replacebase包中找到该功能的帮助页面非常有帮助.最糟糕的是,它没有任何可以帮助理解其工作原理的例子.

你能解释一下如何使用它吗?一两个例子会很棒.

r

32
推荐指数
3
解决办法
14万
查看次数

为什么有些逻辑运算符如此之慢?

虽然试图优化我的代码,我发现了一些logical操作进行比较,以类似的操作时,比我预想的要慢integernumeric.

于是我就到重写基本布尔运算符!,&,|,xor如下:

my.not <- function(x) as.logical(1L - as.integer(x))
my.and <- function(e1, e2) as.logical(as.integer(e1) * as.integer(e2))
my.or  <- function(e1, e2) as.logical(as.integer(e1) + as.integer(e2))
my.xor <- function(e1, e2) as.logical(as.integer(e1) + as.integer(e2) == 1L)
Run Code Online (Sandbox Code Playgroud)

测试一切是否按预期工作:

a <- sample(c(TRUE, FALSE), 1e6, TRUE)
b <- sample(c(TRUE, FALSE), 1e6, TRUE)

identical(!a, my.not(a))             # TRUE
identical(a & b, my.and(a, b))       # TRUE
identical(a | b, my.or(a, b))        # TRUE
identical(xor(a, b), my.xor(a, b)) …
Run Code Online (Sandbox Code Playgroud)

boolean-logic r

27
推荐指数
2
解决办法
1002
查看次数

如何检查向量是否包含n个连续数字

假设我的矢量数包含c(1,2,3,5,7,8),我希望找到它是否包含3个连续数字,在这种情况下,它们是1,2,3.

numbers = c(1,2,3,5,7,8)
difference = diff(numbers) //The difference output would be 1,1,2,2,1
Run Code Online (Sandbox Code Playgroud)

为了验证我的数字向量中有3个连续的整数,我尝试了以下几点奖励.

rep(1,2)%in%difference 
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于这种情况,但如果我的差异向量=(1,2,2,2,1),即使"1"不是连续的,它仍然会返回TRUE.

r

26
推荐指数
5
解决办法
2万
查看次数

将矩阵写入文件,没有标题和行号

我在R中有一个矩阵变量,比如k.我想把它写成文件.我使用的代码如下:

write.table(k,file="outfile",sep="\t")
Run Code Online (Sandbox Code Playgroud)

但是当我获取文件并打开它时,它包含标题.第一行是:"v1""v2"......"V6000".之后,每行以行号开头,如"1","2"等.我不想要标题.有没有办法做到这一点?

现在我甚至无法再将文件加载到R中read.table("outfile",header=TRUE,sep= "\t"),它甚至与我之前输出的文件不一样.R识别文件中的第一个colunm,它是行号作为新列.

load r file

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

标签 统计

r ×10

r-faq ×2

apply ×1

boolean-logic ×1

data.table ×1

dataframe ×1

ellipsis ×1

file ×1

filter ×1

list ×1

load ×1

plyr ×1

subset ×1