清理包含需要折叠的多个级别的因子的最有效(即有效/适当)方法是什么?也就是说,如何将两个或多个因子级别组合成一个.
这是一个示例,其中"是"和"Y"这两个级别应折叠为"是","否"和"N"折叠为"否":
## Given:
x <- c("Y", "Y", "Yes", "N", "No", "H") # The 'H' should be treated as NA
## expectedOutput
[1] Yes Yes Yes No No <NA>
Levels: Yes No # <~~ NOTICE ONLY **TWO** LEVELS
Run Code Online (Sandbox Code Playgroud)
一个选择当然是在手工使用sub和朋友之前清理琴弦.
另一种方法是允许重复标签,然后丢弃它们
## Duplicate levels ==> "Warning: deprecated"
x.f <- factor(x, levels=c("Y", "Yes", "No", "N"), labels=c("Yes", "Yes", "No", "No"))
## the above line can be wrapped in either of the next two lines
factor(x.f)
droplevels(x.f)
Run Code Online (Sandbox Code Playgroud)
但是,有更有效的方法吗?
虽然我知道levels …
我搜索了一个参考,以了解R中的替换函数,但我还没有找到.我试图理解R中替换函数的概念.我有下面的代码,但我不明白它:
"cutoff<-" <- function(x, value){
x[x > value] <- Inf
x
}
Run Code Online (Sandbox Code Playgroud)
然后我们用以下方式调用cutoff:
cutoff(x) <- 65
Run Code Online (Sandbox Code Playgroud)
谁能解释R中的替换功能是什么?
我有一列数据是A,B和C级别的因素,我有兴趣将这些级别中的两个组合成一个因子,所以它会变成A和B,B = B和C,或者可能是新的变量A和D,D = B和C.我可以通过使用if语句循环遍历列来提供大量方法来实现这一点,但我觉得应该有一个更优雅的方法,我想知道是否有人可以指出我正确的方向.
我已经看到lapplyR中使用的函数从矩阵列表中的矩阵中提取元素.
例如,我有一个3(2x2)矩阵的列表,我想从这3个矩阵中的每一个中提取元素[1,2].
代码:list1 = lapply(mylist, '[', 1,2)工作正常.它返回包含这3个元素的列表.
我正在努力研究这是做什么的.谷歌没有帮助和使用?'['R的帮助不是太解释.我不知道'['R中的函数是怎么样的,所以代码不直观.
考虑以下:
df <- data.frame(a = 1, b = 2, c = 3)
names(df[1]) <- "d" ## First method
## a b c
##1 1 2 3
names(df)[1] <- "d" ## Second method
## d b c
##1 1 2 3
Run Code Online (Sandbox Code Playgroud)
这两种方法都没有返回错误,但第一次没有更改列名,而第二次没有.
我认为它与我只在一个子集上运行的事实有关df,但为什么,例如,以下工作正常呢?
df[1] <- 2
## a b c
##1 2 2 3
Run Code Online (Sandbox Code Playgroud) 我经常遇到这种情况,我认为必须有一个很好的成语.假设我有一个包含一系列属性的data.frame,包括"product".我还有一把钥匙,可以将产品转化为品牌+尺寸.产品代码1-3是Tylenol,4-6是Advil,7-9是拜耳,10-12是Generic.
什么是最快的(就人类时间而言)编码方式?
ifelse如果有3个或更少的类别,我倾向于使用嵌套的;如果有超过3个类型,则键入数据表并将其合并.任何更好的想法?Stata有一个非常漂亮的recode命令,虽然我相信它会促进数据代码混合有点过分.
dat <- structure(list(product = c(11L, 11L, 9L, 9L, 6L, 1L, 11L, 5L,
7L, 11L, 5L, 11L, 4L, 3L, 10L, 7L, 10L, 5L, 9L, 8L)), .Names = "product", row.names = c(NA,
-20L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud) 我想知道如何在R语言中进行赋值.
考虑以下R shell会话:
> x <- c(5, 6, 7)
> x[1] <- 10
> x
[1] 10 6 7
>
Run Code Online (Sandbox Code Playgroud)
我完全理解.创建向量(5,6,7)并将其绑定到符号"x".之后,'x'会反弹到新的向量(10,6,7),因为向量是不可变的数据结构.
但这里发生了什么:
> c(4, 5, 6)[1] <- 10
Error in c(4, 5, 6)[1] <- 10 :
target of assignment expands to non-language object
>
Run Code Online (Sandbox Code Playgroud)
或者在这里:
> f <- function() c(4, 5, 6)
> f()[1] <- 10
Error in f()[1] <- 10 : invalid (NULL) left side of assignment
>
Run Code Online (Sandbox Code Playgroud)
在我看来,只能为命名数据结构(如'x')赋值.
我问的原因是因为我试图实现R语言核心,我不确定如何处理这样的任务.
提前致谢
我今天遇到了以下问题,我想知道是否有更好的方法来完成我想要做的事情.
假设我有以下data.table(只是每小时时间戳):
library(data.table)
tdt <- data.table(Timestamp = seq(as.POSIXct("1980-01-01 00:00:00"), as.POSIXct("2015-01-01 00:00:00"), '1 hour'))
> tdt
Timestamp
1: 1980-01-01 00:00:00
2: 1980-01-01 01:00:00
3: 1980-01-01 02:00:00
4: 1980-01-01 03:00:00
5: 1980-01-01 04:00:00
---
306813: 2014-12-31 20:00:00
306814: 2014-12-31 21:00:00
306815: 2014-12-31 22:00:00
306816: 2014-12-31 23:00:00
306817: 2015-01-01 00:00:00
Run Code Online (Sandbox Code Playgroud)
我的目标是将时间戳的分钟更改为10分钟.
我知道我可以用:
library(lubridate)
minute(tdt$Timestamp) <- 10
Run Code Online (Sandbox Code Playgroud)
但这并没有利用数据表的超快速度(我需要).我的笔记本电脑上有:
> system.time(minute(tdt$Timestamp) <- 10)
user system elapsed
11.29 0.16 11.45
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:我们可以在数据表语法中以某种方式使用替换函数,以便它可以使用我想要data.table的速度吗?如果答案是否定的,data.table那么快速完成此任务的任何其他解决方案都是可以接受的.
如果你想知道我尝试的其中一件事是:
tdt[, Timestamp2 := minute(Timestamp) <- 10]
Run Code Online (Sandbox Code Playgroud)
这不起作用.
我刚刚发现它`[<-`可能具有破坏性的副作用,或者取决于它给出的参数.
例
x <- 1:5
x
# [1] 1 2 3 4 5
`[<-`(x, 1:5, 1)
# [1] 1 1 1 1 1
x
# [1] 1 2 3 4 5 # ? last application of `[<-` was non-destructive
`[<-`(x, 1:5, TRUE)
# [1] 1 1 1 1 1
x
# [1] 1 1 1 1 1 # ? the last application of `[<-` had a destructive side-effect
Run Code Online (Sandbox Code Playgroud)
问:是否有一个普遍可靠地防止破坏性的行为,或反对它至少后卫呢?(简而言之,`[<-`完全避免.)
笔记
我无法在文档( …