选择数据框中按组第一次出现的所有行(包括第一次出现)

2024-01-08

我一直在摸不着头脑不知道该怎么做。我正在重新组织一些不平衡的面板数据(堆叠/长格式)。我需要按组(id)保留所有行,包括变量(indc = D)值的第一次出现,并且还保留尚未发生这种情况的组的行。我唯一希望丢弃的行是每组中存在第二个或更多指示变量值 (indc=D) 的行。我还需要保留数据框中的所有列。

# Data 
id<-factor(c(1,1,1,2,2,2,2,2, 3,3,3,3,3,3,4,4))
time<-c(1,2,3,1,2,3,4,5, 1,2,3,4,5,6, 1,2)
indc<-factor(c("C","C","D","C","C","C","D","D","C","C","C","C","D","D","C","C"))
var1<-sample(seq(1,8.5, by=0.5))
var2<-c(rep(1,8),rep(0,8))

df<-data.frame(id,time,indc,var1,var2)

我的尝试是使用 by 和 match - 问题是它返回最后一个变量作为匹配项以及每个组的索引。我陷入了如何获得最终解决方案的困境。

attempt<-by(df, df$id, function(x) {match(unique(x$indc=="D"), x$indc=="D")} )

results<-(do.call("rbind", attempt))

期望的结果是 df2df2<-df[c(1:3,4:7,9:13,15:16),]

如果有人对解决方案有想法,我将非常感激。


一种选择是使用 dplyr 按“id”进行分组,然后计算“indc ==”D”的行的累积和。然后检查并过滤该累积和

require(dplyr)
df %>% group_by(id) %>% filter(cumsum(indc == "D") <= 1)
#Source: local data frame [14 x 5]
#Groups: id
#
#   id time indc var1 var2
#1   1    1    C  1.5    1
#2   1    2    C  1.0    1
#3   1    3    D  7.0    1
#4   2    1    C  2.5    1
#5   2    2    C  3.5    1
#6   2    3    C  6.5    1
#7   2    4    D  3.0    1
#8   3    1    C  2.0    0
#9   3    2    C  7.5    0
#10  3    3    C  6.0    0
#11  3    4    C  8.0    0
#12  3    5    D  8.5    0
#13  4    1    C  4.0    0
#14  4    2    C  4.5    0

评论后编辑#1:

感谢@akrun 下面的评论,这里有两个关于如何子集化的更多选项:

选项 1:使用基 R:

df[with(df, ave(indc=='D', id, FUN=function(x) cumsum(x)<=1)),]

选项2:使用data.table:

require(data.table)
setDT(df)[,.SD[cumsum(indc=='D')<=1], by=id]

感谢@akrun


在OP评论后编辑#2:

例如,如果出现第一个“D”,然后在同一组中出现另一行,其中出现“C”(或其他字母),则并不 100% 清楚您希望如何删除行。如果它发生在第一个“D”出现之后,我最初的答案将保留这样的行。要更改该行为并删除第一个“D”出现后的所有行,您只需添加另一个cumsum到代码中,如下所示(对于修改后的数据,如下所示):

df %>% group_by(id2) %>% filter(cumsum(cumsum(indc2 == "D")) <= 1L)
#Source: local data frame [13 x 5]
#Groups: id2
#
#   id2 time2 indc2 var1 var2
#1    1     1     C  8.0    1
#2    1     2     C  5.0    1
#3    1     3     D  7.0    1
#4    2     1     C  1.0    1
#5    2     2     C  2.0    1
#6    2     3     D  9.0    1
#7    3     1     C  4.5    0
#8    3     2     C  3.0    0
#9    3     3     C  7.5    0
#10   3     4     C  1.5    0
#11   3     5     D  4.0    0
#12   4     1     C  6.0    0
#13   4     2     C  6.5    0

data

df <- structure(list(id2 = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L), .Label = c("1", "2", 
"3", "4"), class = "factor"), time2 = c(1, 2, 3, 4, 1, 2, 3, 
4, 5, 1, 2, 3, 4, 5, 6, 1, 2), indc2 = structure(c(1L, 1L, 2L, 
1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L), .Label = c("C", 
"D"), class = "factor"), var1 = c(8, 5, 7, 8.5, 1, 2, 9, 3.5, 
2.5, 4.5, 3, 7.5, 1.5, 4, 5.5, 6, 6.5), var2 = c(1, 1, 1, 1, 
1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("id2", "time2", 
"indc2", "var1", "var2"), row.names = c(NA, -17L), class = "data.frame")

> df
   id2 time2 indc2 var1 var2
1    1     1     C  8.0    1
2    1     2     C  5.0    1
3    1     3     D  7.0    1
4    1     4     C  8.5    1    <-- this row will also be removed now
5    2     1     C  1.0    1
6    2     2     C  2.0    1
7    2     3     D  9.0    1
8    2     4     D  3.5    1
9    2     5     D  2.5    0
10   3     1     C  4.5    0
11   3     2     C  3.0    0
12   3     3     C  7.5    0
13   3     4     C  1.5    0
14   3     5     D  4.0    0
15   3     6     D  5.5    0
16   4     1     C  6.0    0
17   4     2     C  6.5    0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

选择数据框中按组第一次出现的所有行(包括第一次出现) 的相关文章

  • R:在函数中包含循环?

    以下代码可用于创建一个 data frame 其中 Kendall Tau 和 Spearman 相关结果彼此相邻 data mtcars mtcars correlation lt function x y df1 cor data fr
  • 在 R 中修改传单弹出窗口

    我想修改 R 中传单弹出窗口的外观 帮助文件指出 in the popupOptions 函数需要 传递给底层 Javascript 对象构造函数的额外选项 In 这个例子 https rstudio github io leaflet p
  • 如何在multilist中设置xlim?

    以下代码创建 3 个向量 并将它们显示为交错直方图 a lt c 1 2 3 b lt c 1 1 2 c lt c 1 1 1 l lt list a b c multhist l col c red green blue xlim c
  • 在 Linux 下更改 RStudio 用户界面(不是图形等)中的字体大小

    This is not关于更改使用 RStudio 生成的图表中的字体大小的问题 我已经知道该怎么做了 我在配备 视网膜 显示屏的 MacBook Pro 上的 Linux 下使用 RStudio 我使用 KDE 作为我的窗口管理器 我可以
  • 在 R Shiny 中显示/隐藏整个框元素

    我目前正在尝试找到一种方法来隐藏 显示 R Shiny 中的整个 box 元素 以及里面的所有内容 我想创建一个可能的按钮 它允许用户展开特定框 然后使用相同 甚至不同 的按钮隐藏它 我不想使用条件面板 因为我的应用程序非常大并且会产生一些
  • 如何将 mcmc.list 转换为 bugs 对象?

    我正在使用rjagsR 库 功能coda samples产生一个mcmc list 例如 来自example coda samples library rjags data LINE LINE recompile LINE out lt c
  • 如何根据查找表匹配多列

    我有以下两个数据框 lookup lt data frame id c A B C price c 1 2 3 results lt data frame price 1 c 2 2 1 price 2 c 3 1 1 我现在想要浏览所有列
  • 使用 dplyr 的 select 引用变量名[重复]

    这个问题在这里已经有答案了 通常我会想要选择变量的子集 其中该子集是函数的结果 在这个简单的例子中 我首先获取与宽度特征相关的所有变量名称 library dplyr library magrittr data iris width var
  • 在 ggplot 中过滤管道 df

    我正在使用 dplyr 管道来清理我的 df 然后直接输入到 ggplot 中 但是 我只想一次只绘制一组 因此我需要过滤到该组 问题是 我希望比例保持不变 就好像所有群体都存在一样 是否可以在 ggplot 命令中进一步过滤管道 df 例
  • 绘制带有颜色渐变的geom_segment线? (或者还有另一种方法来强调开始与结束吗?)

    我的数据框中有大量行 100 000 的两组纬度和经度变量 我正在尝试绘制一个连接这两组坐标的图 即 从纬度1 经度1 to 纬度2 经度2 使用 geom segment 使用非常低的 alpha 使线条透明 因为线条太多 我想强调这些线
  • 在 R 中收集多组列[重复]

    这个问题在这里已经有答案了 我有一个宽数据框 需要将其收集或融化成一个高数据框 我遇到的问题是我有几组列需要保持关联 分组 我每个表单提交有 2 个用户 每个用户有 3 列数据 我想将这 6 列基本上以 3 组的形式堆叠起来 以便每个用户都
  • 求解非线性方程组

    我正在尝试求解以下四个方程组 我尝试过使用 rootSolve 包 但似乎我无法通过这种方式找到解决方案 我正在使用的代码如下 model lt function x F1 lt sqrt x 1 2 x 3 2 1 F2 lt sqrt
  • 替换rmarkdown/knitr/pdf中字幕的自动编号

    我正在使用 Rmarkdown 生成 PDF 文档 我想在其中手动定义图号 下面是一个块的示例 r chunk26 fig cap Fig 5 3 My figure caption plot 1 1 我使用特殊的编号来遵循文档的章节 问题
  • 使用插入符和方法 = gamLoess 进行训练时 R 崩溃

    当我运行下面的代码时 R 崩溃了 如果我在训练调用中注释掉tuneGrid行 就不会发生崩溃 我已经用另一个数据集尝试过此操作 但仍然使 R 崩溃 崩溃消息是 R 会话中止 R遇到致命错误 会话被终止 开始新会话 代码是 library s
  • 在 R 中,如何将 SpatialPolygons* 转换为地图对象

    我正在尝试利用ProportionalSymbolMap在此定义的地图JSS论文 http www jstatsoft org v15 i05 为了绘制比例符号 我首先需要一个地图类的对象 The methods http www ncea
  • 如何强制在较新版本的 R 上安装较旧的软件包?

    我无法安装proj4string进入我当前版本的 R 2 15 1 Warning message package proj4string is not available for R version 2 15 1 我认为这是因为 2 15
  • 在r中拆分数据并将所有拆分文件保存在csv中

    我有一个名为 data 的数据集 Model Garage City Honda C Chicago Maruti B Boston Porsche A New York Honda B Chicago Honda C New York 它
  • 如何在 R 中为所有plot.default、plot 或lines 调用设置默认颜色

    为了简化我的日常 R 交互 我想为所有绘图设置默认颜色 例如 假设我想要用红线绘制所有绘图 例如在 gnuplot 中 到目前为止 这是我的 Rprofile 的片段 setHook packageEvent grDevices onLoa
  • 计算不包括当前值的平均值

    我有下表 a b avg 1 1 7 3 2 1 0 3 3 1 2 3 4 2 1 2 5 2 3 2 其中 a 和 b 是数据 avg 计算按 a 分组的 b 的平均值 现在我想计算按 a 分组的 b 的平均值 avg2 不包括当前值
  • “未找到 JAVA 路径。请检查 JAVA 是否已安装。”初始化 RSelenium 时出错

    我正在尝试启动一个 RSelenium 会话到 webscrape 但是 当运行此代码时 driver lt rsDriver browser c chrome chromever 76 0 3809 126 port 4444L 我收到此

随机推荐