使用 data.table R 选择行或列?

2024-02-14

假设我有一个 data.table,例如:

library(data.table) 
RRR <-data.table(1:15,runif(15),rgeom(15,0.5),rbinom(15,2,0.5))

    V1      V2    V3  V4
 1:  1 0.33577273  0  0
 2:  2 0.66739739  2  1
 3:  3 0.07501655  0  0
 4:  4 0.43195663  2  1
 5:  5 0.39525841  3  2
 6:  6 0.15189738  1  1
 7:  7 0.02637279  0  1
 8:  8 0.44165623  0  1
 9:  9 0.98710570  2  0
10: 10 0.62402805  1  0
11: 11 0.84829465  3  2
12: 12 0.02170976  0  1
13: 13 0.74608925  0  2
14: 14 0.29102296  2  0
15: 15 0.83820646  1  1

如何从中获取 data.table,其中所有行的任何列都包含“0”? (或某个值)
如果我必须用一列来完成,我可以使用:

RRR[V4==0,]

   V1    V2      V3  V4
1:  1 0.33577273  0  0
2:  3 0.07501655  0  0
3:  9 0.98710570  2  0
4: 10 0.62402805  1  0
5: 14 0.29102296  2  0

但是,如果我想一次处理所有列,因为我有很多列,该怎么办?

这不能满足我的需要。

RRR[,sapply(RRR,function(xx)(xx==0)), with=TRUE]   

     V1      V2     V3    V4
[1,]  FALSE FALSE  TRUE  TRUE
[2,]  FALSE FALSE FALSE FALSE
[3,]  FALSE FALSE  TRUE  TRUE
[4,]  FALSE FALSE FALSE FALSE
[5,]  FALSE FALSE FALSE FALSE
[6,]  FALSE FALSE FALSE FALSE
[7,]  FALSE FALSE  TRUE FALSE
[8,]  FALSE FALSE  TRUE FALSE
[9,]  FALSE FALSE FALSE  TRUE
[10,] FALSE FALSE FALSE  TRUE
[11,] FALSE FALSE FALSE FALSE
[12,] FALSE FALSE  TRUE FALSE
[13,] FALSE FALSE  TRUE FALSE
[14,] FALSE FALSE FALSE  TRUE
[15,] FALSE FALSE FALSE FALSE

也许用一个 for 循环和一些复杂的粘贴? 不过,我更喜欢使用简单的 data.table 语法。

同样,如何获得所有行中包含“0”的列的 data.table?

我知道如何获取满足条件的列(作为一个整体),例如数字,

RRR[,sapply(RRR,function(xx)is.numeric(xx)),with=FALSE]

但如果我想按元素测试条件,则此方法不起作用。


如果有人感兴趣,这是更大的随机 data.table 的 system.time() ,其中包含您迄今为止提供的不同解决方案,并稍加修改。

set.seed(1)
n <- 1000000
RRR <- data.table(matrix(rgeom(100*n,0.5), ncol=100))

Getting ROWS   
> RRR[RRR[,rowSums(RRR==0)>0]] 
   user  system elapsed 
   2.72    0.55    3.27 
> RRR[rowSums(RRR==0)>0] 
   user  system elapsed 
   2.58    0.70    3.28 
> RRR[apply(RRR,MAR=1,function(xx)any(xx==0))]
   user  system elapsed 
   10.81    0.19   11.00       
> RRR[apply(RRR[,paste0('V',1:ncol(RRR)),with=FALSE],function(xx)any(xx==0),MAR=1)]
  user  system elapsed 
  10.49    0.30   10.83 

Getting COLUMNS
> RRR[,sapply(RRR,function(xx)any(xx==0)), with=FALSE] 
   user  system elapsed 
   0.81    0.31    1.12 
> `[.listof`(RRR,colSums(RRR==0)>0) 
   user  system elapsed 
   2.14    0.27    2.41 
> RRR[,colSums(RRR==0)>0, with=FALSE] 
   user  system elapsed 
   2.26    0.48    2.75 
> RRR[, .SD, .SDcols=sapply(RRR, function(x) any(x==0))]      #only version 1.9.5, seems the same solution than the first one.
   user  system elapsed 
   0.78    0.36    1.14 
> RRR[, .SD, .SDcols=sapply(RRR, function(x) any(!as.logical(x)))]
   user  system elapsed 
   0.41    0.25    0.66 
> RRR[Reduce('|',lapply(RRR,function(xx)(xx==0)))]
   user  system elapsed 
   3.11    0.33    3.44 
> RRR[,apply(RRR[,paste0('V',1:ncol(RRR)),with=FALSE],function(xx)any(xx==0),MAR=2),with=FALSE]
   user  system elapsed 
   3.48    0.80    4.28  

我还没有包括:

RRR[, i := any(unlist(lapply(.SD, function(x) x==0))), seq_len(nrow(RRR))][i==TRUE][,i:=NULL]   

花了几分钟,我停止了它,它“标记”行而不是提取它们,这是最复杂的解决方案。

我将等待更快或更简单的解决方案,并听取您的评论和喜好。

sapply 应该会更慢,但事实并非如此。 如果 data.table 包含其他类型的数据,结果可能会改变。


如果我们能够在每行或每列中第一次出现时立即停止测试(==0),我们就可以加快速度。但我想如果没有循环或一些低级访问或按位操作我们就无法做到这一点。

我想到了一个新方法。

  1. sapply(R,函数(x)which(x==0))
  2. 我需要将 a) 的结果与列表的并集结合起来,但我不知道如何对任意数量的列执行此操作。
  3. 然后获取该行 RRR["a)"]

我想如果零的数量很大的话,速度会慢得多。

或许也可以尝试一下RRR[unique(unlist(sapply(RRR,function(xx)which(xx==0))))]但太慢了。

获得相反结果的一个选择是RRR[(RRR==0)] <- NA; na.omit(RRR)


The rowSums可以在这里使用函数:

RRR[rowSums(!RRR)>0]

怎么运行的: !RRR是一个矩阵TRUE在任意零处。一般情况下,可以替换!RRR无论你想检查什么逻辑条件。例如,查看是否有任何元素等于3,你可以采取rowSums of RRR==3.

I think rowSums(test(x))>0本质上是一样的apply(RRR,1,function(x)any(!test(x)));两者都将对象强制为矩阵。我找到了rowSums版本更容易阅读并且我想我听到人们称赞它的效率。


对于列,类似:

RRR[, colSums(!RRR)>0, with=FALSE]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 data.table R 选择行或列? 的相关文章

  • 如何将同一行中以逗号分隔的值拆分到R中的不同行

    我有一些数据来自谷歌表格 https forms gle rGQQL3tvA1PrE4dD8我想拆分以逗号分隔的答案 and 复制参与者的 ID 数据如下 gt head data names Q2 Q3 Q4 1 PART 1 fruit
  • R中整数类和数字类有什么区别

    我想先说我是一个绝对的编程初学者 所以请原谅这个问题是多么基本 我试图更好地理解 R 中的 原子 类 也许这适用于一般编程中的类 我理解字符 逻辑和复杂数据类之间的区别 但我正在努力寻找数字类和整数类之间的根本区别 假设我有一个简单的向量x
  • 读取R中打开的Excel文件

    有没有办法将打开的Excel文件读入R 当Excel中打开一个excel文件时 Excel会对文件加锁 比如R中的read方法无法访问该文件 你能绕过这个锁吗 Thanks 编辑 这发生在带有原始 Excel 的 Windows 下 发生错
  • SQL Server - 将行连接到逗号分隔的列表中

    假设我有一个临时表 如下所示 Id Value 1 1 1 2 1 3 2 1 2 2 我希望我的桌子是这样的 Id ValueList 1 1 2 3 2 1 2 所以基本上我需要将我的值分组为逗号分隔的列表 我已经尝试过以下操作 SEL
  • 计算互相关函数?

    In R 我在用ccf or acf计算成对互相关函数 以便我可以找出哪个移位给我带来最大值 从它的外观来看 R给我一个标准化的值序列 Python 的 scipy 中是否有类似的东西 或者我应该使用fft模块 目前 我正在这样做 xcor
  • 从 R 中的方差分析 (glm) 中提取残余偏差

    我在 R 中安装了一个 glm 模型并采用了方差分析表 我需要提取 残余偏差 列 但它会产生错误 以下是代码 创建数据 counts lt c 18 17 15 20 10 20 25 13 12 outcome lt gl 3 1 9 t
  • 用表达式分割轴标签

    我有一个带有包含表达式的长标签的图 我想将其分成两行 在表达式中添加 n 结果不符合预期 ylabel lt expression A very long label with text and n expression alpha bet
  • ubuntu中R的igraph包的安装

    我使用以下命令在 ubuntu 中安装 R 的 igraph 包 install packages igraph 但我收到一条错误消息 警告 无法访问存储库的索引 http ftp iitm ac in cran src contrib h
  • 融化R中的下半矩阵

    如何融化下半三角形加对角矩阵 11 NA NA NA NA 12 22 NA NA NA 13 23 33 NA NA 14 24 34 44 NA 15 25 35 45 55 A lt t matrix c 11 NA NA NA NA
  • R 将多个值与向量进行比较并返回向量[重复]

    这个问题在这里已经有答案了 我有一个向量 A 对于 A 的每个元素 我想检查它是否等于第二个向量 Targets 中的任何元素 我想要一个逻辑值向量 其长度为 A 作为返回 也提到了同样的问题here http r 789695 n4 na
  • 将第 N 行上的 NA 行插入 data.frames 列表,其中 N 来自列表

    经过几个小时后 我发现自己无法解决以下问题 我有一个数据框列表 我想分别向每个 DF 插入 而不是替换 一行或多行 NA 始终至少一行 要插入的 NA 数量存储在单独的列表中 为了说明这一点 我有以下两个列表 list of datafra
  • 一段 R 代码会影响 foreach 输出中的随机数吗?

    我使用运行模拟foreach and doParallel并与随机数 名为random在代码中 简而言之 我模拟一个足球联赛 随机生成所有比赛的获胜者以及相应的结果 在dt base没有比赛进行 在dt ex1 and dt ex24场比赛
  • 跟踪循环迭代

    抛硬币 成功 你赢100 否则你输50 你会一直玩 直到你口袋里有钱a 的价值如何a在任何迭代中都被存储 a lt 100 while a gt 0 if rbinom 1 1 0 5 1 a lt a 100 else a lt a 50
  • 如何添加链接以从我的 R闪亮应用程序在新窗口中打开 pdf 文件?

    我可以使用 a 从我的 Shiny 应用程序添加到外部站点的超链接 a google href http www google com 但如何创建一个链接来打开 pdf 或类似 文件 看起来应该很简单 但我找不到任何例子 我的问题与此类似
  • rpart“as.character(x) 中的错误:无法强制类型 'builtin' 为类型 'character' 的向量”消息是什么意思?

    我一直在用头撞rpart几天了 尝试为我拥有的这个数据集制作分类树 我认为现在是时候询问生命线了 我确信这是我没有看到的愚蠢的事情 但这里是我一直在做什么 EuropeWater lt read csv file paste Users a
  • 如何在 Caret 中绘制随机森林(护林员)树

    我生成了如下所示的随机森林树 并尝试绘制它 但出现错误 我在哪里犯了错误 我怎样才能以正确的方式绘制它 Actmodel lt train Activity Section Author data CB1 method ranger trC
  • 在 R 传单中添加不透明度滑块

    如何在 R leaflet 应用程序中添加滑块来控制特定图层的不透明度 对于这个应用程序 我不想使用闪亮 这里建议 在 R 传单应用程序中添加滑块 https stackoverflow com questions 37682619 add
  • 尝试使用 JRI 将 R 与我的 Java 应用程序集成,但出现错误。谁能解释一下原因和解决办法吗?

    我需要将 Java 与 R 集成来运行一些数学命令并使用 R 的功能进行绘图 以下部分代码给出了错误 public static void main String args HelloRWorld r new HelloRWorld r h
  • R中的重叠矩阵

    我有以下数据框 id channel 1 a 1 b 1 c 2 a 2 c 3 a 我想创建并重叠矩阵 它基本上是一个方阵 行和列标签为 a b c 表中的每个条目显示每个通道共有多少个 id 例如 在上面的例子中 矩阵看起来像 a b
  • R - 计算 bin 中特定值的数量

    我有一个如下所示的数据框 df Value lt c 1 1 0 2 1 3 4 0 0 1 2 0 3 0 4 5 2 3 0 6 Sl lt c 1 20 df lt data frame Sl Value gt df Sl Value

随机推荐

  • pimpl 使模板编码不那么混乱

    我正在尝试创建一个更清晰的头文件 以供头类的参考 文档使用 同时仍然认识到模板的便利性 所以我有一个快速的 h hpp 文件 mempool h namespace internal template
  • PHP 帖子名称通配符 - $_POST['var_'.*];

    是否可以使用某种通配符来创建以特定字符串开头的 POST 变量 本质上 我试图捕获任何包含 bSortable wildcard 作为名称的 POST bSortable 1 bSortable 2 bSortable 3 我正在为 jqu
  • 如何从向量创建元组?

    下面是一个示例 它分割字符串并解析每个项目 将其放入一个其大小在编译时已知的元组中 use std str FromStr fn main let some str 123 321 312 let num pair str some str
  • 如何解决 em_mysql2 的“连接仍在等待结果”错误

    我在 Goliath eventmachine 下将 activerecord 与 em mysql2 一起使用 最奇怪的事情发生在我的用户模型上 当我第一次向 users 发送 POST 时 一切正常 按预期查找 当我执行第二次 POST
  • 可以将 ASP.NET 编译为机器代码吗?

    是否可以将 ASP NET Web 应用程序编译为机器语言 如果是这样 有任何性能优势吗 是的你可以 NGen exe http msdn microsoft com en us library 6t9t5wcf aspx 这是一个 Sta
  • window.onbeforeunload 和 window.onunload 在 Firefox、Safari、Opera 中不起作用?

    在我的聊天应用程序中 当我的应用程序关闭时 我需要得到用户的确认 所以我用了window onbeforeunload用于确认警报和window onunload for logout 但这两个功能都可以在 IE 和 Chrome 中使用
  • 有什么方法可以返回对函数中创建的变量的引用吗?

    我想编写一个程序 分两步写入一个文件 在程序运行之前该文件可能不存在 文件名是固定的 问题是OpenOptions new write 可能会失败 在这种情况下 我想调用自定义函数trycreate 这个想法是创建文件而不是打开它并返回句柄
  • C 逗号运算符的使用[重复]

    这个问题在这里已经有答案了 您会看到它在 for 循环语句中使用 但它在任何地方都是合法的语法 您在其他地方发现了它的哪些用途 如果有的话 C 语言 以及 C 历史上是两种完全不同的编程风格的混合体 可以称为 语句编程 和 表达式编程 如您
  • JQuery JSONP 跨域调用不执行任何操作

    每当我通过 jquery 对我设置的任何页面 本地或服务器上 进行 JSONP 调用时 我得到的只是静默处理 Firebug 报告 200 OK 并且响应看起来没问题 我设置了成功时弹出的警报框 或者 失败但两者都没有出现 似乎无论我使用什
  • 使用 .Net 验证路径相等性

    比较 Net 中的两个路径以确定它们是否指向同一文件或目录的最佳方法是什么 如何验证它们是否相同 c Some Dir SOME FILE XXX C SOME DIR some file xxx 更好的是 有没有办法验证这些路径是否指向某
  • jQuery 动态 qtip 显示 div,但每次鼠标悬停都会变得越来越慢

    我使用 jQuery qTip 插件来显示鼠标悬停链接 img 的 div 我写了两个选项来使用 但这两个选项都造成了麻烦 V1 第一个版本仅在我第二次将鼠标移到链接上时才显示工具提示 重复将鼠标悬停在链接上后 脚本似乎变得越来越慢 6 7
  • php unlink() 非ascii字符=找不到文件[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 简短 php unlink 正在处理名称为 asci 的文件 但是 如果我尝试删除名称包括 等的文件 则会出现取消链接生
  • 无法使用ajax从数据库获取数据

    我正在开发 ASP Net MVC 应用程序 我想使用ajax从数据库获取数据 它不会在网页中加载数据 控制台窗口上也没有错误 在 Visual Studio 中也不例外 以下是我的控制器代码 HttpGet public JsonResu
  • 如何使用 HTML 进行 Skype 通话?

    我尝试在我的脚本中插入以下代码片段 通过单击该链接 它应该会呼叫 Skype 帐户 我已经找了好几个小时了 但不明白为什么它不起作用 pre code lt a href quot callTo USERNAME quot gt lt im
  • 市场上的 Github Actions 可以做恶意的事情吗?

    我是 GitHub Actions 的绝对初学者 市场上有可用的操作 这些操作是否可以对我的存储库进行恶意操作 例如 删除我的仓库 将恶意代码提交到我的存储库中 从私人存储库复制内容 答案是 不幸的是 YES 您可以在这里找到一些参考 使用
  • 使用PHPExcel制作自动生成excel文件

    我想让我的 Excel 文件填充从数据库中获取的一些数据 例如某人的姓名和年龄 假设我的数据库中有 10 个人 我希望将这 10 个人包含在我的 Excel 文件中 所以基本上 你会得到 姓名年龄 人1 20岁 人2 25岁 等等 我知道如
  • JavaScript 函数返回 TYPE BOOLEAN 的变量名称,而不是模板文字中的值本身 [重复]

    这个问题在这里已经有答案了 javascript 中是否有一个函数 我可以将变量 而不是值 设置为像 parseVariableName 这样的字符串 例如 在我的场景中 我想要使用布尔变量有一个 动态类名不创建对象 将其作为数组并循环 我
  • 回形针不保存附件

    我是 Rails 和 Web 开发领域的新手 我已经创建了一个用户模型 现在我正在尝试让用户能够使用回形针添加个人资料图片 在我的用户显示页面中 用户可以单击链接打开 编辑 页面 从中可以看到要浏览的表单并选择要上传的图像 单击按钮时 它会
  • 从数据库读取和显示时,“应用程序启动方法中出现异常,java.lang.reflect.InitationTargetException”

    我正在尝试从 MySQL 数据库读取值并将其显示在 JavaFX 的表中 我使用netbeans IDE 当我运行代码时 我得到了标题中提到的异常 我将在下面发布代码 public class ViewSubject extends App
  • 使用 data.table R 选择行或列?

    假设我有一个 data table 例如 library data table RRR lt data table 1 15 runif 15 rgeom 15 0 5 rbinom 15 2 0 5 V1 V2 V3 V4 1 1 0 3