楼主: picklerice
11758 10

[问答] R如何获取数据框中指定列每一分类数据框? [推广有奖]

  • 0关注
  • 0粉丝

本科生

19%

还不是VIP/贵宾

-

威望
0
论坛币
181 个
通用积分
0
学术水平
10 点
热心指数
10 点
信用等级
10 点
经验
638 点
帖子
41
精华
0
在线时间
111 小时
注册时间
2011-3-8
最后登录
2023-3-19

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
以R软件中的Titanic作为例子:     Titanic数据框如下:
                Titanic数据框
     如果只取某一列中相对应的分类数据框有很多方法实现,变量名==“某一分类”、或者使用subset函数,但是如果涉及多个变量,而且需要对每一个变量的每一个分类取数据框,然后再针对提取的相应数据框进行计算,如何批量实现?
     下面是我尝试编写代码,但是无法得到想要的结果,输出的文件为只有变量名的空数据集。
  1. #使用R软件中自带的Titanic数据库为例测试
  2.        var.table<-lapply(Titanic,table)
  3.        z<-sapply(var.table,function(x) names(x))
  4.        z1<-as.vector(z)
  5.        z2<-unlist(z1)
  6.        z3<-as.data.frame(z2)
  7.        z4<-as.vector(z3$z2)    #以上代码将每一个变量的分类提取到同一个向量中
  8.        var.name<-as.vector(colnames(Titanic[,c(2,3)]))    #便于测试,这里仅用Sex,Age两个变量作为测试变量
  9.        for (i in var.name){
  10.              for (j in var.table){
  11.                 Titanic_ij<-subset(Titanic,i==j)      #运用两个for循环,对变量名和相应的分类进行判别,借助subset函数获取想要的数据框
  12.                 write.csv(Titanic_ij,file="C:/Users/Administrator/Desktop/Titanic_ij.csv")    #仅为测试,将获得的最后一个数据框输出,这里也可以加入其它的针对每一个获得的数据框的分析
  13.               }
  14.         }
复制代码
       请教大神问题出在哪里?如何针对以上代码进行改进,以便得到想要的结果?或者有更简洁的方法,新手求指教,感谢!

二维码

扫码加我 拉你入群

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

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

关键词:分类数据 数据框 Titanic Subset titan

沙发
jinkelazzz 发表于 2017-12-15 17:38:44 |只看作者 |坛友微信交流群
> Titanic[,1,1,] #sex = MALE & age = Child
      Survived
Class  No Yes
  1st   0   5
  2nd   0  11
  3rd  35  13
  Crew  0   0
> Titanic[,2,2,] #sex = FEMALE & age = Adult
      Survived
Class   No Yes
  1st    4 140
  2nd   13  80
  3rd   89  76
  Crew   3  20
总共4个维度
第一维 1:4 Class
第二维 1:2 sex
第三维 1:2 age
第四维 1:2 survived

使用道具

藤椅
picklerice 发表于 2017-12-16 13:00:17 |只看作者 |坛友微信交流群
jinkelazzz 发表于 2017-12-15 17:38
> Titanic[,1,1,] #sex = MALE & age = Child
      Survived
Class  No Yes
我测试了您给的代码,以我目前的理解水平,您这里好像得到的是选取sex和age相应分类下的数据,然后再按照class和survival不同分类对Freq变量频数进行汇总。我是想得到相应分类的原始数据框。感谢您的不吝赐教!

使用道具

板凳
qwertyqwertu 发表于 2017-12-16 17:07:28 |只看作者 |坛友微信交流群
dplyr包的filter

使用道具

报纸
picklerice 发表于 2017-12-17 19:34:35 |只看作者 |坛友微信交流群
qwertyqwertu 发表于 2017-12-16 17:07
dplyr包的filter
您好,看了一下,好像也无法直接实现多个变量的批处理

使用道具

地板
qwertyqwertu 发表于 2017-12-17 23:09:44 |只看作者 |坛友微信交流群
picklerice 发表于 2017-12-17 19:34
您好,看了一下,好像也无法直接实现多个变量的批处理
那再试试group_by
总之dplyr强无敌

使用道具

7
jinkelazzz 发表于 2017-12-18 08:39:30 |只看作者 |坛友微信交流群
picklerice 发表于 2017-12-16 13:00
我测试了您给的代码,以我目前的理解水平,您这里好像得到的是选取sex和age相应分类下的数据,然后再按照 ...
你把数据转成数据框不就好了

使用道具

8
picklerice 发表于 2017-12-18 11:07:20 |只看作者 |坛友微信交流群
jinkelazzz 发表于 2017-12-18 08:39
你把数据转成数据框不就好了
不好意思,没理解呢,按您给的思路,得到的是汇总的结果,而不是按行筛选的数据框,您的意思的在计算过程的数据框能够提取吗?

使用道具

9
picklerice 发表于 2017-12-21 16:43:50 |只看作者 |坛友微信交流群
对原有代码简化测试:
  1. for (j in z4){
  2.        Titanic_ij<-filter(Titanic,Age==j)
  3.        sumF<-sum(Titanic_ij$Freq)
  4.        print(sumF)
  5.        }
复制代码

可以计算出满足Age条件时的结果: Age条件下的结果.jpg
但是当使用数据框中提取的变量向量作为筛选条件时,结果全部为0,这里是不是就说明了从该向量中提取的变量,不能作为数据框进行filter或者subset筛选的逻辑判断变量?还是我提取的变量名存在问题?
  1. var.table<-lapply(Titanic,table)
  2. z<-sapply(var.table,function(x) names(x))
  3. z1<-as.vector(z)
  4. z2<-unlist(z1)
  5. z3<-as.data.frame(z2)
  6. z4<-as.vector(z3$z2)
  7. var.name<-as.vector(colnames(Titanic[,c(2,3)]))
  8. for (i in var.name){
  9.     for (j in z4){
  10.          Titanic_ij<-as.data.frame(filter(Titanic,i==j))
  11.          sumF<-sum(Titanic_ij$Freq)
  12.          print(sumF)
  13.         }
  14. }
复制代码
以上为相关代码,求大神指教!

使用道具

10
zerofung 学生认证  发表于 2017-12-23 00:10:13 |只看作者 |坛友微信交流群
如果我没有理解错,你想要的是Titanic %>% group_by(Sex,Age) %>% nest()对吗?(先加载tidyverse包)

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-15 02:25