楼主: ariera
21448 12

[问答] 请问如何统计R数据框中的每行符合条件的列数 [推广有奖]

  • 0关注
  • 18粉丝

已卖:519份资源

副教授

36%

还不是VIP/贵宾

-

威望
0
论坛币
7871 个
通用积分
48.2642
学术水平
25 点
热心指数
29 点
信用等级
18 点
经验
54323 点
帖子
216
精华
1
在线时间
1269 小时
注册时间
2010-5-24
最后登录
2023-3-2

楼主
ariera 学生认证  发表于 2015-11-9 21:48:02 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
如下data frame:

isAisBisCisDother
xyesnoyesnoNA
yyesyesyesyesNA
znonoyesnoNA

[/table]统计结果如下,就是增加1列ANS,且其中的数字为每行的yes 个数,
[table=448]
   
  isA  isB  isC  isD  other  ANS
   x  yes  no  yes  no  NA  

2


   y  yes  yes  yes  yes  NA  

4


   z  no  no  yes  no  NA  

1


请不要使用for循环依次判断,这个都会...
我想问一下从R最突出的向量计算来讲这个能怎么解决?


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据框 Other Table Frame for循环 如何 统计

沙发
jiangbeilu 学生认证  发表于 2015-11-9 22:28:38
这段代码可以解决你的问题:
  1. isA=c("yes","no","yes",NA)
  2. isB=c("no","yes","no",NA)
  3. df <- data.frame(isA,isB)
  4. apply(df,1,function(x) table(x)["yes"])
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
ariera + 5 + 1 + 1 + 1 热心帮助其他会员

总评分: 论坛币 + 5  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
万人往LVR 在职认证  发表于 2015-11-9 22:41:56
rowSums(data=="Yes")
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
ariera + 5 + 1 + 1 + 1 热心帮助其他会员

总评分: 论坛币 + 5  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

板凳
hzx21th 发表于 2015-11-9 23:22:54
顶楼上的;
楼上的楼上所谓的apply和for循环其实是一样的

报纸
jiangbeilu 学生认证  发表于 2015-11-10 00:50:05
hzx21th 发表于 2015-11-9 23:22
顶楼上的;
楼上的楼上所谓的apply和for循环其实是一样的
也可以这么理解,不过apply的for循环是调用 的C里的循环,比R本身的for循环要好一些

地板
cheetahfly 在职认证  发表于 2015-11-10 09:45:36
万人往LVR 发表于 2015-11-9 22:41
rowSums(data=="Yes")
这种方法比较快

我用rbenchmark包的工具测试,随机“yes”和“no”,4列,行数从10000依次增长到100000,系统耗时的变化如下:
benchmark.png
已有 1 人评分学术水平 收起 理由
jiangbeilu + 5 精彩帖子

总评分: 学术水平 + 5   查看全部评分

7
jiangbeilu 学生认证  发表于 2015-11-12 20:21:45
cheetahfly 发表于 2015-11-10 09:45
这种方法比较快

我用rbenchmark包的工具测试,随机“yes”和“no”,4列,行数从10000依次增长到10000 ...
学习了哈

8
yywan0913 在职认证  发表于 2015-11-13 10:01:09
cheetahfly 发表于 2015-11-10 09:45
这种方法比较快

我用rbenchmark包的工具测试,随机“yes”和“no”,4列,行数从10000依次增长到10000 ...
不是apply的问题   而是function问题   这里table(x)['yes']  相当于做了两遍工作,
  1. > system.time({p=apply(d,1,function(x) table(x)["yes"])})
  2.    user  system elapsed
  3. 18.537   0.027  18.549
  4. > system.time({p=apply(d,1,function(x) sum(x=='yes'))})
  5.    user  system elapsed
  6.   0.669   0.004   0.673
复制代码

9
cheetahfly 在职认证  发表于 2015-11-13 16:31:07
yywan0913 发表于 2015-11-13 10:01
不是apply的问题   而是function问题   这里table(x)['yes']  相当于做了两遍工作,
多谢提醒,我也奇怪apply没理由这么怂。用你的公式我重新做了一次benchmark,行数从100,000依次增长到1,000,000行。结果如下:
测试结果.png

只有当数据量非常大,比如观测数大于50万以上,两者的差距才会在日常运用中感受到。


测试结果.png (4.9 KB)

测试结果.png

测试结果.png (4.9 KB)

测试结果.png

10
ariera 学生认证  发表于 2015-11-25 19:27:20
万人往LVR 发表于 2015-11-9 22:41
rowSums(data=="Yes")
这个不好使.... 而且参数需为矩阵...不方便观察

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-2 01:29