之前出现子集化时丢弃未使用的因子级别的问题.常见的解决方案包括通过声明尽可能使用字符向量
options(stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)
但有时候,有序因素对于绘图是必要的,在这种情况下我们可以使用便利函数droplevels
来创建一个包装器subset
:
subsetDrop <- function(...){droplevels(subset(...))}
Run Code Online (Sandbox Code Playgroud)
我意识到这subsetDrop
主要解决了这个问题,但是在某些情况下,子集化via [
更方便(而且输入更少!).
我的问题是,为了方便起见,我们可以通过覆盖[
数据帧以自动降低因子水平来推动它成为R的"默认"行为.例如,Hmisc包中包含dropUnusedLevels
哪些覆盖[.factor
用于对单个因子进行子集化(不再需要,因为默认值[.factor
似乎具有drop
用于删除未使用级别的参数).我正在寻找一种类似的解决方案,它允许我使用数据帧进行子集化,[
但会自动丢弃未使用的因子级别(当然,在有序因子的情况下保留顺序).
我使用%in%进行子集化,我遇到了一个奇怪的结果.
> my.data[my.data$V3 %in% seq(200,210,.01),]
V1 V2 V3 V4 V5 V6 V7
56 470 48.7 209.73 yes 26.3 54 470
Run Code Online (Sandbox Code Playgroud)
那是对的.但是当我扩大范围时......第56行就消失了
> my.data[my.data$V3 %in% seq(150,210,.01),]
V1 V2 V3 V4 V5 V6 V7
51 458 48.7 156.19 yes 28.2 58 458
67 511 30.5 150.54 yes 26.1 86 511
73 535 40.6 178.76 yes 29.5 73 535
Run Code Online (Sandbox Code Playgroud)
你能告诉我什么是错的吗?有没有更好的方法来对数据帧进行子集化?
这是它的结构
> str(my.data)
'data.frame': 91 obs. of 7 variables:
$ V1: Factor w/ 91 levels "100","10004",..: 1 2 3 4 5 6 7 …
Run Code Online (Sandbox Code Playgroud) 我有一个非常大的列表,包含大约10,000个元素,每个元素是一个大到50亿的整数.我想从最大大小为10,000个元素的数组的每个可能的大小'k'(由用户给出)子集中找到最大元素的总和.我想到的唯一解决方案是生成每个子集(使用itertools)并找到其最大元素.但这需要花费大量时间!解决这个问题的pythonic方法是什么?
像这样的样本:
In [39]: ts = pd.Series(np.random.randn(20),index=pd.date_range('1/1/2000',periods=20))
In [40]: t = pd.DataFrame(ts,columns=['base'],index=ts.index)
In [42]: t['shift_one'] = t.base - t.base.shift(1)
In [43]: t['shift_two'] = t.shift_one.shift(1)
In [44]: t
Out[44]:
base shift_one shift_two
2000-01-01 -1.239924 NaN NaN
2000-01-02 1.116260 2.356184 NaN
2000-01-03 0.401853 -0.714407 2.356184
2000-01-04 -0.823275 -1.225128 -0.714407
2000-01-05 -0.562103 0.261171 -1.225128
2000-01-06 0.347143 0.909246 0.261171
.............
2000-01-20 -0.062557 -0.467466 0.512293
Run Code Online (Sandbox Code Playgroud)
现在,如果我们使用t [t.shift_one> 0],它可以正常工作,但是当我们使用时:在[48]中:t [t.shift_one> 0和t.shift_two <0] -------- -------------------------------------------------- ----------------- ValueError Traceback(最近一次调用last)in()----> 1 t [t.shift_one> 0和t.shift_two <0]
ValueError: The truth value of …
Run Code Online (Sandbox Code Playgroud) 如果列中的值(在这种情况下是参与者标识号)落在某个范围内,例如61701到61721和61901到61929,我想删除数据帧中的数据行.
我知道如何根据阈值对数据进行子集化,例如:
datasetnew = dataset[dataset$X<=100, ]
Run Code Online (Sandbox Code Playgroud)
但不确定如何使用一系列数字来分组和删除行.不确定子集是我需要的.
假设我在Haskell中有以下数据结构来表示Checkers/Drafts部分:
data Piece = Reg {pos :: Square, color :: Color}
| King {pos :: Square, color :: Color}
deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)
鉴于这些列表,Pieces
我如何King
从列表中隔离s?我一直在寻找的文档,Data.Set
在http://www.haskell.org/ghc/docs/7.6.2/html/libraries/containers-0.5.0.0/Data-Set.html但无法找到的东西,对我来说似乎很明显
简而言之,我需要一个方法,给定一Data.Set
组Piece
,返回所有King
类型片段的子集.我觉得这很简单,但我还没有遇到过因为我是Haskell中的Data.Set类的新手.
set.seed(8)
df <- data.frame(
A=sample(c(1:3), 10, replace=T),
B=sample(c(1:3), 10, replace=T),
C=sample(c(1:3), 10, replace=T),
D=sample(c(1:3), 10, replace=T),
E=sample(c(1:3), 10, replace=T),
F=sample(c(1:3), 10, replace=T))
Run Code Online (Sandbox Code Playgroud)
想要将列的子集传递给dplyr mutate()
并进行逐行计算,例如cor()
在列AC和DF之间获得相关性,但无法弄清楚如何.在这里,这里和这里找到了SO的灵感,但却未能产生可接受的代码.例如,我试过这个:
require(plyr)
require(dplyr)
df %>%
rowwise() %>%
mutate(c=cor(.[[1:3]],.[[4:6]]))
Run Code Online (Sandbox Code Playgroud) 我试图找出一种对矩阵进行子集化的方法,这种矩阵纯粹是数字的(即没有列/行名称).为了把它放在一个工作示例的形式中,我想删除不符合逻辑条件的行.
set.seed(42)
m <- matrix(sample.int(100, 10*10, TRUE), 10, 10)
Run Code Online (Sandbox Code Playgroud)
假设我想制作一个子集,所以我保留最大行值为90或以上的行,但删除那些不符合此条件的行.
我能想到这样做的唯一方法是通过if/else循环(max(m[i,]) > 90
)但我觉得必须有一种更优雅的方式来做到这一点.
有任何想法吗?
我想得到一个介于多个范围之间的值列表.
library(data.table)
values <- data.table(value = c(1:100))
range <- data.table(start = c(6, 29, 87), end = c(10, 35, 92))
Run Code Online (Sandbox Code Playgroud)
我需要结果只包含介于这些范围之间的值:
results <- c(6, 7, 8, 9, 10, 29, 30, 31, 32, 33, 34, 35, 87, 88, 89, 90, 91, 92)
Run Code Online (Sandbox Code Playgroud)
我目前正在使用for循环,
results <- data.table(NULL)
for (i in 1:NROW(range){
results <- rbind(results,
data.table(result = values[value >= range[i, start] &
value <= range[i, end], value]))}
Run Code Online (Sandbox Code Playgroud)
但实际数据集非常大,我正在寻找一种更有效的方法.
任何建议表示赞赏!谢谢!
我试图想出一个关于followig问题的简单解决方案.这是最小的工作示例:
data <- data.frame(subject = c('Math', 'English', 'French', 'English'),
grade = c(1, 3, 5, 4))
Run Code Online (Sandbox Code Playgroud)
我想要一个比较Enlish等级的函数,并返回一个逻辑向量,对于具有最高英语等级的行,其值为TRUE,对于所有其他行,则为FALSE.在这种情况下[1] FALSE FALSE FALSE TRUE
.