天道酬勤,学无止境

用重复序列子集 df(subsetting df with repeated sequences)

问题

我已经四处寻找解决方案,但我找不到.....

我的数据框(基本上是按日期排列的排名第一的运动队的表格)有很多场合,其中一个或多个团队会“重新出现”在数据中。 我想在 no 处提取每个时期的开始(或结束)日期。 每队 1 个。

数据的一个例子可能是:

x1<- as.Date("2013-12-31")
adddate1 <- 1:length(teams1)
dates1 <- x1 + adddate1
teams2 <- c(rep("w", 3), rep("c", 8), rep("w", 4))
x2<- as.Date("2012-12-31")
adddate2 <- 1:length(teams2)
dates2 <- x2 + adddate2
dates <- c(dates2, dates1)
teams <- c(teams2, teams1)
df <- data.frame(dates, teams)
df$year <- year(df$dates)

2013年看起来像:

        dates teams year
1  2013-01-01     w 2013
2  2013-01-02     w 2013
3  2013-01-03     w 2013
4  2013-01-04     c 2013
5  2013-01-05     c 2013
6  2013-01-06     c 2013
7  2013-01-07     c 2013
8  2013-01-08     c 2013
9  2013-01-09     c 2013
10 2013-01-10     c 2013
11 2013-01-11     c 2013
12 2013-01-12     w 2013
13 2013-01-13     w 2013
14 2013-01-14     w 2013
15 2013-01-15     w 2013

但是,使用 ddply 聚合同名团队并返回以下内容:

split <- ddply(df, .(year, teams), head,1)
split <- split[order(split[,1]),]

       dates teams year
2 2013-01-01     w 2013
1 2013-01-04     c 2013
3 2014-01-01     c 2014
4 2014-01-09     k 2014

有没有比创建一个函数更优雅的方法来执行此操作,该函数将遍历原始 df 并为每个子集返回一个唯一值,将其添加到 df 中,然后使用 ddply 合并新的唯一值来返回我想要的内容?

回答1

你说一些团队“重新出现”,那时我认为这个答案中的小组intergroup助手功能可能正是这里的正确工具。 在您的情况下,当有团队(例如“w”)在同一年(例如 2013 年)重新出现时,另一个团队已经存在一段时间(例如“c”)后,这很有用。 现在,如果您想将每个团队的每个出现序列视为单独的组,以便获得该序列的第一个或最后一个日期,那么此功能何时有用。 请注意,如果您像往常一样仅按“团队”和“年份”分组,则每个团队(例如“w”)只能有一个第一个/最后一个日期(例如在 dplyr 中使用“summarise”时)。

定义函数:

intergroup <- function(var, start = 1) {
  cumsum(abs(c(start, diff(as.numeric(as.factor(var))))))
}

现在首先按年份对数据进行分组,然后另外使用团队列上的组间功能:

library(dplyr)
df %>%
  group_by(year) %>%
  group_by(teamindex = intergroup(teams), add = TRUE) %>%
  filter(dense_rank(dates) == 1)

最后,您可以根据需要进行过滤。 例如,我在这里过滤最小日期。 结果将是:

#Source: local data frame [3 x 4]
#Groups: year, teamindex
#
#       dates teams year teamindex
#1 2013-01-01     w 2013         1
#2 2013-01-04     c 2013         2
#3 2013-01-12     w 2013         3

请注意,团队“w”再次出现,因为我们通过使用组间函数创建的“teamindex”进行分组。

进行过滤的另一种选择是这样的(使用排列然后slice ):

df %>%
  group_by(year) %>%
  group_by(teamindex = intergroup(teams), add = TRUE) %>%
  arrange(dates) %>%
  slice(1)

我使用的数据来自 akrun 的回答。

回答2

你也可以使用rle创建teamindex

library(dplyr)
 df %>% 
    group_by(year) %>% 
    group_by(teamindex= with(rle(teams),
          rep(seq_along(lengths), lengths)), add=TRUE) %>%
          filter(dates==min(dates)) #or #filter(dates==max(dates))

 #        dates teams year teamindex
 #1 2013-01-01     w 2013         1
 #2 2013-01-04     c 2013         2
 #3 2013-01-12     w 2013         3

或者

df %>% 
   group_by(year) %>%
   group_by(teamindex= with(rle(teams),
      rep(seq_along(lengths), lengths)), add=TRUE) %>%
   arrange(dates) %>%
   slice(n()) #or #slice(1)
 #       dates teams year teamindex
 #1 2013-01-03     w 2013         1
 #2 2013-01-11     c 2013         2
 #3 2013-01-15     w 2013         3

数据

df <- structure(list(dates = structure(c(15706, 15707, 15708, 15709, 
15710, 15711, 15712, 15713, 15714, 15715, 15716, 15717, 15718, 
15719, 15720), class = "Date"), teams = c("w", "w", "w", "c", 
"c", "c", "c", "c", "c", "c", "c", "w", "w", "w", "w"), year = c(2013L, 
2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 
2013L, 2013L, 2013L, 2013L, 2013L)), .Names = c("dates", "teams", 
"year"), row.names = c("1", "2", "3", "4", "5", "6", "7", "8", 
"9", "10", "11", "12", "13", "14", "15"), class = "data.frame")
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • R:如何过滤/细分日期序列(R: How to filter/subset a sequence of dates)
    问题 我有此数据:(12月完成) date sessions 1 2014-12-01 1932 2 2014-12-02 1828 3 2014-12-03 2349 4 2014-12-04 8192 5 2014-12-05 3188 6 2014-12-06 3277 并且需要对其进行子集/过滤,例如从“ 2014-12-05”到“ 2014-12-25” 我知道您可以使用运算符“:”创建一个序列。 例如:b <-c(1:5) 但是如何过滤一个序列呢? 我试过了 NewDate <- filter(Dates, date("2014-12-05":"2014-12-12")) 但是说: 错误:“ NewDate <-过滤器(日期,日期(“ 2014-12-05”:“ 2014-12-12”)NewDate“中的意外符号 回答1 你可以使用subset 生成样本数据: temp<- read.table(text="date sessions 2014-12-01 1932 2014-12-02 1828 2014-12-03 2349 2014-12-04 8192 2014-12-05 3188 2014-12-06 3277", header=T) 确保其为日期格式: temp$date <- as.Date(temp$date, format= "%Y-%m-%d")
  • R中带有if语句的线性回归[重复](Linear regression in R with if statement [duplicate])
    问题 这个问题在这里已经有了答案: 如何在具有特定数据范围的 R 中运行线性模型? (1 个回答) 4年前关闭。 我有一个虚拟变量black ,其中black==0是白色, black==1是黑色。 我试图只为black==1类别拟合线性模型lm ,但是运行下面的代码会给我不正确的系数。 R中有没有办法用if语句运行模型,类似于Stata? library(foreign) df<-read.dta("hw4.dta") attach(df) black[black==0]<-NA model3<-lm(rent~I(income^2)+income+black) 回答1 如果看起来这里有一些问题。 首先,您已将所有数据存储在单独的向量rent 、 income和black 。 您应该将其存储在数据框中: data <- data.frame(rent, income, black) 要基于逻辑表达式限制数据框,您可以使用subset函数: data.limited <- subset(data, black == 1) 最后,您可以在有限的数据框上运行分析(大概没有black变量): model3 <- lm(rent~I(income^2)+income, data=data.limited) 回答2 为什么不在运行模型之前对数据进行子集化?
  • R - 在数据框的子集中查找所有唯一值(R - find all unique values among subsets of a data frame)
    问题 我有一个包含两列的数据框。 第一列定义数据的子集。 我想在第二列中查找仅出现在第一列的一个子集中的所有值。 例如,来自: df=data.frame( data_subsets=rep(LETTERS[1:2],each=5), data_values=c(1,2,3,4,5,2,3,4,6,7)) data_subsets data_values A 1 A 2 A 3 A 4 A 5 B 2 B 3 B 4 B 6 B 7 我想提取以下数据框。 data_subsets data_values A 1 A 5 B 6 B 7 我一直在玩duplicated但我似乎无法让它工作。 任何帮助表示赞赏。 有许多主题解决了类似的问题,我希望我在搜索时没有忽略答案! 编辑 我修改了@Matthew Lundberg 计算元素数量并从数据框中提取的方法。 出于某种原因,他的方法不适用于我拥有的数据框,所以我想出了这个,虽然不太优雅,但可以完成工作: counts=rowSums(do.call("rbind",tapply(df$data_subsets,df$data_values,FUN=table))) extract=names(counts)[counts==1] df[match(extract,df$data_values),] 回答1 首先,在 df$data
  • R语言学习笔记——R数据结构(1)(一维数据:向量)
    数据结构1 数据结构 同质性数据结构 异质性数据结构 向量 矩阵 多维数组 列表 数据框 除此之外还有字符串、日期时间数据、时间序列数据等。 (一)向量(一维数据) 常用的向量为:数值向量、逻辑向量、字符向量 1.数值向量 (1)数值向量是由数值组成的向量,单个数值的长度为1的数值向量 > x<-1.5 > x [1] 1.5 > numeric(10) #可以用numeric()来创建全为0的指定长度数值向量 [1] 0 0 0 0 0 0 0 0 0 0 > c(1,2,3,4,5) #用函数c()实现将多个对象合并到一起 [1] 1 2 3 4 5 > c(1,"a","!") [1] "1" "a" "!" > c(1,2,c(3,4,5)) [1] 1 2 3 4 5 (2)创建等差的数值向量 函数:seq(from ,to ,by ,length.out ,along with) 其中 from:设置首相 to :设置尾相 by :设置等差值(默认为1) length.out:设置序列长度 along with:以该参考的长度作为序列长度 > seq(1,10,2) [1] 1 3 5 7 9 (3)创建重复的数值向量 函数:rep(x ,times ,length.out ,each) 其中 x: 为要重复的序列 times :设置重复次数 length.out
  • 将所有重复的行跨到Python Pandas的多个列中(Drop all duplicate rows across multiple columns in Python Pandas)
    问题 pandas drop_duplicates函数非常适合“统一”数据帧。 但是,要传递的关键字参数之一是take_last=True或take_last=False ,而我想删除所有重复的行,这些行跨列的子集。 这可能吗? A B C 0 foo 0 A 1 foo 1 A 2 foo 1 B 3 bar 1 A 例如,我要删除与列A和C匹配的行,因此应删除行0和1。 回答1 现在,通过drop_duplicates和keep参数,这在熊猫中要容易得多。 import pandas as pd df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]}) df.drop_duplicates(subset=['A', 'C'], keep=False) 回答2 只想添加到本关于drop_duplicates的答案中: keep :{'first','last',False},默认为'first' first:删除第一个重复项之外的重复项。 last:除去最后一次出现的重复项。 False:删除所有重复项。 因此,将keep设置为False将为您提供所需的答案。 DataFrame.drop_duplicates(* args,** kwargs
  • 取具有相同功能的data.frame的子集,然后从每个子集中选择一行(Take the subsets of a data.frame with the same feature and select a single row from each subset)
    问题 假设我在R中有一个矩阵,如下所示: ID Value 1 10 2 5 2 8 3 15 4 7 4 9 ... 我需要的是一个随机样本,其中每个元素仅代表一次。 这意味着将选择ID 1,将选择ID 2的两行之一,ID 3,将选择ID 4的两行之一,以此类推... 可以有两个以上重复项。 我正在尝试找出最R风格的方法来执行此操作,而无需对子集进行子集化和采样? 谢谢! 回答1 tapply横跨rownames和抓取sample的1各在ID组: dat[tapply(rownames(dat),dat$ID,FUN=sample,1),] # ID Value #1 1 10 #3 2 8 #4 3 15 #6 4 9 如果您的数据确实是matrix而不是data.frame ,那么您也可以使用以下方法来解决此问题: dat[tapply(as.character(seq(nrow(dat))),dat$ID,FUN=sample,1),] 不要试图删除as.character ,因为只有一个值传递给as.character , sample会给出意想不到的结果。 例如 replicate(10, sample(4,1) ) #[1] 1 1 4 2 1 2 2 2 3 4 回答2 您可以使用dplyr来做到这一点,如下所示: library(dplyr) df %>%
  • 按顺序创建重复值的顺序?(Create sequence of repeated values, in sequence?)
    问题 我需要一个重复的数字序列,即1 1 ... 1 2 2 ... 2 3 3 ... 3 etc. 。我实现此方法的方法是: nyear <- 20 names <- c(rep(1,nyear),rep(2,nyear),rep(3,nyear),rep(4,nyear), rep(5,nyear),rep(6,nyear),rep(7,nyear),rep(8,nyear)) 可以,但是笨拙,显然扩展性不佳。 如何依次将N个整数重复M次? 我尝试嵌套seq()和rep()但是并没有完全满足我的要求。 我显然可以编写一个for循环来执行此操作,但是应该有一个固有的方法来执行此操作! 回答1 您错过了rep()的each=参数: R> n <- 3 R> rep(1:5, each=n) [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 R> 所以你的例子可以用一个简单的 R> rep(1:8, each=20) 回答2 另一个base R选项可以是gl() : gl(5, 3) 输出是一个因素: [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 Levels: 1 2 3 4 5 如果需要整数,则可以将其转换为: as.numeric(gl(5, 3)) [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 回答3
  • 基于多个列的具有唯一个案的子集(Subset with unique cases, based on multiple columns)
    问题 我想对数据框进行子集处理,以仅包含具有三列的唯一组合的行。 我的情况与该问题中提出的情况类似,但我也想在数据中保留其他列。 这是我的示例: > df v1 v2 v3 v4 v5 1 7 1 A 100 98 2 7 2 A 98 97 3 8 1 C NA 80 4 8 1 C 78 75 5 8 1 C 50 62 6 9 3 C 75 75 请求的输出将是这样的,在这里我仅基于v1,v2和v3寻找独特的情况: > df.new v1 v2 v3 v4 v5 1 7 1 A 100 98 2 7 2 A 98 97 3 8 1 C NA 80 6 9 3 C 75 75 如果我可以恢复非唯一行,那也很好: > df.dupes v1 v2 v3 v4 v5 3 8 1 C NA 80 4 8 1 C 78 75 5 8 1 C 50 62 我看到了一个有关如何在sql中执行此操作的问题(在此处),但我无法在R中得到它。我敢肯定这很简单,但搞砸了unique()和subset()并没有取得成果。 提前致谢。 回答1 您可以使用duplicated()函数来找到唯一的组合: > df[!duplicated(df[1:3]),] v1 v2 v3 v4 v5 1 7 1 A 100 98 2 7 2 A 98 97 3 8 1 C NA 80 6 9 3 C 75 75
  • 为数据框每组内的行创建一个序列号(计数器)[重复](Create a sequential number (counter) for rows within each group of a dataframe [duplicate])
    问题 这个问题已经在这里有了答案: 为数据帧中的组内的行编号(8个答案) 3年前关闭。 我们如何在数据框的每个组中生成唯一的ID号? 这是按“ personid”分组的一些数据: personid date measurement 1 x 23 1 x 32 2 y 21 3 x 23 3 z 23 3 y 23 我希望为“ personid”定义的每个子集中的每一行添加一个具有唯一值的id列,始终以1开头。 这是我想要的输出: personid date measurement id 1 x 23 1 1 x 32 2 2 y 21 1 3 x 23 1 3 z 23 2 3 y 23 3 感谢您的帮助。 回答1 具有参数FUN=seq_along的具有误导性的ave()函数将很好地完成此操作-即使您的personid列未严格排序。 df <- read.table(text = "personid date measurement 1 x 23 1 x 32 2 y 21 3 x 23 3 z 23 3 y 23", header=TRUE) ## First with your data.frame ave(df$personid, df$personid, FUN=seq_along) # [1] 1 2 1 1 2 3 ## Then with another, in
  • Spark / Scala在多个列上使用相同的函数重复调用withColumn()(Spark/Scala repeated calls to withColumn() using the same function on multiple columns)
    问题 我目前有一些代码,其中我通过多个.withColumn链重复地对多个DataFrame列应用相同的过程,并且想要创建一个简化过程的函数。 就我而言,我发现了键汇总的列上的累积总和: val newDF = oldDF .withColumn("cumA", sum("A").over(Window.partitionBy("ID").orderBy("time"))) .withColumn("cumB", sum("B").over(Window.partitionBy("ID").orderBy("time"))) .withColumn("cumC", sum("C").over(Window.partitionBy("ID").orderBy("time"))) //.withColumn(...) 我想要的是类似的东西: def createCumulativeColums(cols: Array[String], df: DataFrame): DataFrame = { // Implement the above cumulative sums, partitioning, and ordering } 或更妙的是: def withColumns(cols: Array[String], df: DataFrame, f: function)
  • 如何将颜色分配给变量 ggplot2 的子集(how to assign colour to subset of variables ggplot2)
    问题 我有一个包含 379838 行和 13 个变量的数据框(13 个临床样本): > str( df) 'data.frame': 379838 obs. of 13 variables: $ V1 : num 0.8146 0.7433 0.0174 0.177 0 ... $ V2 : num 0.7465 0.5833 0.0848 0.5899 0.0161 ... $ V3 : num 0.788 0.843 0.333 0.801 0.156 ... $ V4 : num 0.601 0.958 0.319 0.807 0.429 ... $ V5 : num 0.792 0.49 0.341 0.865 1 ... $ V6 : num 0.676 0.801 0.229 0.822 0.282 ... $ V7 : num 0.783 0.732 0.223 0.653 0.507 ... $ V8 : num 0.69 0.773 0.108 0.69 0.16 ... $ V9 : num 0.4014 0.5959 0.0551 0.7578 0.2784 ... $ V10: num 0.703 0.784 0.131 0.698 0.204 ... $ V11: num 0.6731 0.8224 0.125 0.6021 0.0772 ... $
  • 通过删除行的多个逻辑条件对数据框进行子集设置(Subset dataframe by multiple logical conditions of rows to remove)
    问题 我想通过指定不是( ! )的行保留在新数据框中来对数据框进行子集化(过滤)。 这是一个简化的示例数据框: data v1 v2 v3 v4 a v d c a v d d b n p g b d d h c k d c c r p g d v d x d v d c e v d b e v d c 例如,如果列v1的一行具有“ b”,“ d”或“ e”,则我想摆脱该行观测值,从而产生以下数据帧: v1 v2 v3 v4 a v d c a v d d c k d c c r p g 我一次成功地基于一种条件进行了子集化。 例如,在这里我删除v1包含“ b”的行: sub.data <- data[data[ , 1] != "b", ] 但是,我有很多这样的条件,因此一次执行一个条件是不可取的。 我在以下方面没有成功: sub.data <- data[data[ , 1] != c("b", "d", "e") 或者 sub.data <- subset(data, data[ , 1] != c("b", "d", "e")) 我也尝试过其他一些事情,例如!%in% ,但这似乎不存在。 有任何想法吗? 回答1 ! 应该在声明的外面: data[!(data$v1 %in% c("b", "d", "e")), ] v1 v2 v3 v4 1 a v d c 2 a v d
  • 如何计算熊猫数据框中的重复行?(How to count duplicate rows in pandas dataframe?)
    问题 我正在尝试计算数据框中每种类型的行的重复项。 例如,假设我在熊猫中有一个数据框,如下所示: df = pd.DataFrame({'one': pd.Series([1., 1, 1]), 'two': pd.Series([1., 2., 1])}) 我得到一个看起来像这样的df: one two 0 1 1 1 1 2 2 1 1 我想第一步是找到所有不同的唯一行,我这样做是: df.drop_duplicates() 这为我提供了以下df: one two 0 1 1 1 1 2 现在,我想从上面的df([1 1]和[1 2])中获取每一行,并计算出初始df中每行的次数。 我的结果看起来像这样: Row Count [1 1] 2 [1 2] 1 我应该怎么做最后一步? 编辑: 这是一个更大的示例,它更清楚了: df = pd.DataFrame({'one': pd.Series([True, True, True, False]), 'two': pd.Series([True, False, False, True]), 'three': pd.Series([True, False, False, False])}) 给我: one three two 0 True True True 1 True False False 2 True False False
  • 根据因子变量中观察值的数量进行子集(subsetting based on number of observations in a factor variable)
    问题 您如何根据对因子变量水平进行观察的次数来进行子集化? 我有一个包含 1,000,000 行和近 3000 个级别的数据集,我想用较少的 200 个观察值对级别进行子集化。 data <- read.csv("~/Dropbox/Shared/data.csv", sep=";") summary(as.factor(data$factor) 10001 10002 10003 10004 10005 10006 10007 10009 10010 10011 10012 10013 10014 10016 10017 10018 10019 10020 414 741 2202 205 159 591 194 678 581 774 778 738 1133 997 381 157 522 6 10021 10022 10023 10024 10025 10026 10027 10028 10029 10030 10031 10032 10033 10034 10035 10036 10037 10038 398 416 1236 797 943 386 446 542 508 309 452 482 425 272 261 291 145 598 10039 10040 10041 10043 10044 10065 10069 10075 10080 10104
  • 子集一个Python DataFrame(subsetting a Python DataFrame)
    问题 我正在从R过渡到Python。 我刚开始使用熊猫。 我有一个很好的子集的R代码: k1 <- subset(data, Product = p.id & Month < mn & Year == yr, select = c(Time, Product)) 现在,我想在Python中做类似的事情。 到目前为止,这是我得到的: import pandas as pd data = pd.read_csv("../data/monthly_prod_sales.csv") #first, index the dataset by Product. And, get all that matches a given 'p.id' and time. data.set_index('Product') k = data.ix[[p.id, 'Time']] # then, index this subset with Time and do more subsetting.. 我开始感到自己在以错误的方式这样做。 也许,有一个优雅的解决方案。 有人可以帮忙吗? 我需要从我拥有的时间戳中提取月份和年份,然后进行子集设置。 也许有一条线可以完成所有这一切: k1 <- subset(data, Product = p.id & Time >= start_time & Time <
  • 如何基于组标准使用熊猫对数据框进行子集化?(How to subset a data frame using Pandas based on a group criteria?)
    问题 我有一个具有以下结构的大数据集 User X 1 0 1 0 2 0 2 0 2 1 3 0 3 0 我想获取数据的一个子集,以使每个用户的X列的总和为0。在上面的示例中,该子集应仅包括对用户1和3的观察值,如下所示 User X 1 0 1 0 3 0 3 0 有没有一种方法可以使用groupby函数而不对数据进行分组? 我希望该子集包括各个观察值。 回答1 即使DataFrame具有非唯一索引,DSM的答案(使用布尔掩码选择行)也能很好地发挥作用。 我的方法使用索引值选择行,当索引是唯一的时,它的速度会稍微慢一些,而当索引包含重复值时,它的速度会明显慢一些。 @roland:请考虑接受DSM的回答。 您可以使用groupby过滤器: In [16]: df.loc[df.groupby('User')['X'].filter(lambda x: x.sum() == 0).index] Out[16]: User X 0 1 0 1 1 0 5 3 0 6 3 0 就其本身而言,groupby-filter仅返回以下内容: In [29]: df.groupby('User')['X'].filter(lambda x: x.sum() == 0) Out[29]: 0 0 1 0 5 0 6 0 Name: X, dtype: int64 但是您可以使用其索引, In
  • 查找并中断重复运行(Find and break on repeated runs)
    问题 我有一个向量,里面有重复的图案。 我想打破n长度的重复模式发生变化的任何地方。 数据如下: x <- c(rep(1:4, 5), rep(5:6, 3), rep(c(1, 4, 7), 5), rep(c(1, 5, 7), 1), rep(2:4, 3)) ## [1] 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 5 6 5 6 5 6 1 4 7 1 4 7 1 4 7 1 4 7 1 4 7 1 5 7 2 3 4 2 3 4 2 3 4 我希望能够找到模式更改的那些地方,以便像这样中断: 我认为rle可能有用,但不知道如何使用。 回答1 这是执行此操作的功能。 顺便说一句,这是遗传学中的一个问题-查找串联重复序列。 这是一个算法论文的链接,该论文的处理要好得多,但实现起来却要复杂得多。 输出是将x拆分为的组的向量。 首先是一个辅助函数: factorise <- function(x) { x <- length(x) if(x == 1){return(1)} todivide <- seq(from = 2, to = x) out <- todivide[x %% todivide == 0L] return(out) } 现在的主要功能是: findreps <- function(x, counter = NULL){
  • subsetting df with repeated sequences
    I have searched high and low for a solution to this, but I cannot find one..... My dataframe (essentially a table of the no. 1 sports team by date) has numerous occasions where one or various teams would "reappear" in the data. I want to pull out the start (or end) date of each period at no. 1 per team. An example of the data could be: x1<- as.Date("2013-12-31") adddate1 <- 1:length(teams1) dates1 <- x1 + adddate1 teams2 <- c(rep("w", 3), rep("c", 8), rep("w", 4)) x2<- as.Date("2012-12-31") adddate2 <- 1:length(teams2) dates2 <- x2 + adddate2 dates <- c(dates2, dates1) teams <- c(teams2
  • 选择/排除熊猫中的一组列[重复](Selecting/excluding sets of columns in pandas [duplicate])
    问题 这个问题已经在这里有了答案: 从pandas DataFrame删除列(17个答案) 2年前关闭。 我想基于列选择从现有数据框创建视图或数据框。 例如,我想从一个数据帧df1创建一个数据帧df2 ,该数据帧保存其中的所有列,但其中的两个除外。 我尝试执行以下操作,但没有成功: import numpy as np import pandas as pd # Create a dataframe with columns A,B,C and D df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD')) # Try to create a second dataframe df2 from df with all columns except 'B' and D my_cols = set(df.columns) my_cols.remove('B').remove('D') # This returns an error ("unhashable type: set") df2 = df[my_cols] 我究竟做错了什么? 也许更笼统地说,熊猫必须采用什么机制来支持从数据帧中挑选和排除任意列集? 回答1 您可以删除不需要的列,也可以选择所需的列 # Using DataFrame.drop df.drop
  • 子集和ggplot2(Subset and ggplot2)
    问题 我在用ggplot2绘制数据帧的子集时遇到问题。 我的df像: df = data.frame(ID = c('P1', 'P1', 'P2', 'P2', 'P3', 'P3'), Value1 = c(100, 120, 300, 400, 130, 140), Value2 = c(12, 13, 11, 16, 15, 12)) 现在如何仅针对ID的'P1'和'P3'绘制Value1与Value2 ? 例如,我尝试过: ggplot(subset(df,ID=="P1 & P3") + geom_line(aes(Value1, Value2, group=ID, colour=ID))) 但我总是收到一个错误。 回答1 这里有2个子设置选项: 使用基数R中的subset : library(ggplot2) ggplot(subset(dat,ID %in% c("P1" , "P3"))) + geom_line(aes(Value1, Value2, group=ID, colour=ID)) 使用subset的geom_line参数(请注意,我正在使用plyr包来使用特殊的.函数)。 library(plyr) ggplot(data=dat)+ geom_line(aes(Value1, Value2, group=ID, colour=ID),