当我需要过滤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模式下运行的脚本,但我不知道它应该有什么区别.
那么,请你解释一下" 论证子集的非标准评估 "以及为什么它是危险的,或许可以提供一个例子?
文件说
vapply
类似于sapply
,但具有预先指定的返回值类型,因此使用起来更安全.
你能详细说明为什么它通常更安全,可能提供例子吗?
PS:我知道答案,我已经倾向于避免sapply
.我只希望在这里有一个很好的答案,所以我可以指出我的同事.请不要"阅读手册"的答案.
我知道如何添加列表列:
> 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
?
在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) 我正在通过黑客机器学习,我被困在这一行:
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) 我没有replace
从base
包中找到该功能的帮助页面非常有帮助.最糟糕的是,它没有任何可以帮助理解其工作原理的例子.
你能解释一下如何使用它吗?一两个例子会很棒.
虽然试图优化我的代码,我发现了一些logical
操作进行比较,以类似的操作时,比我预想的要慢integer
或numeric
.
于是我就到重写基本布尔运算符!
,&
,|
,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) 假设我的矢量数包含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中有一个矩阵变量,比如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,它是行号作为新列.