楼主: johnmy
18564 7

[实际应用] 请教r数据标准化问题:每行都除以这行的第一个数 [推广有奖]

  • 2关注
  • 5粉丝

已卖:702份资源

讲师

36%

还不是VIP/贵宾

-

威望
0
论坛币
6991 个
通用积分
86.3201
学术水平
42 点
热心指数
55 点
信用等级
20 点
经验
8622 点
帖子
560
精华
0
在线时间
373 小时
注册时间
2008-4-10
最后登录
2025-11-24

楼主
johnmy 发表于 2016-7-23 16:11:24 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

例如:airquality中的前四行。

Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4

现在需要进行的数据变换是第一行数据所有列的数据了除以41,第二行除以36,第三行除以12,第四行除以18,得到一个新的数据框。
我知道搞一个循环很容易实现。
请问有没有现成的函数或包具有这个功能。


二维码

扫码加我 拉你入群

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

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

关键词:数据标准化 数据标准 标准化 quality solar

回帖推荐

cheetahfly 发表于6楼  查看完整内容

补充一下: 一般来说,不管是dataframe还是matrix,如果行数远大于列数,用按列apply会稍快一点: datNormed

bbslover 发表于3楼  查看完整内容

还得有个转置!

本帖被以下文库推荐

学习R

沙发
bbslover 在职认证  发表于 2016-7-23 19:53:30
  1. datNormed <- apply(dat, 1, function(x) x / x[1])
复制代码


这个也许行
已有 1 人评分论坛币 收起 理由
jiangbeilu + 10 精彩帖子

总评分: 论坛币 + 10   查看全部评分

藤椅
bbslover 在职认证  发表于 2016-7-23 19:56:19
  1. datNormed <- t(apply(dat, 1, function(x) x / x[1]))
复制代码


还得有个转置!

板凳
johnmy 发表于 2016-7-23 21:12:01
bbslover 发表于 2016-7-23 19:56
还得有个转置!
果然可以,多谢高手

报纸
lxy444 学生认证  发表于 2016-7-23 21:14:42
bbslover 发表于 2016-7-23 19:56
还得有个转置!
赞,原来还需要转置

地板
cheetahfly 在职认证  发表于 2016-7-24 08:52:22
补充一下:
一般来说,不管是dataframe还是matrix,如果行数远大于列数,用按列apply会稍快一点:
datNormed <- apply(dat, 2, function(x) x /dat[, 1])

如果要经常重复这一过程,原数据若是dataframe,用lapply会快很多:
dat[] <- lapply(dat, function(x) x/dat[[1]])     
或者:
datNormed <- as.data.frame(lapply(dat, function(x) x/dat[[1]]))

如果要经常重复这一过程,原数据若是matrix,就更直接了:
datNormed <- dat/dat[, 1]
已有 3 人评分经验 论坛币 学术水平 收起 理由
李会超 + 60 + 20 精彩帖子
bbslover + 5 + 5 datNormed &lt;- dat/dat[, 1]
jiangbeilu + 10 观点有启发

总评分: 经验 + 60  论坛币 + 35  学术水平 + 5   查看全部评分

7
jiangbeilu 学生认证  发表于 2016-7-24 08:55:35
  1. airquality/matrix(rep(airquality[,1],ncol(airquality)),ncol=ncol(airquality))
复制代码

这样子也行,就是代码长了点。把第一列扩充成一个矩阵,然后直接矩阵对应元素相除即可。
  1. airquality/airquality[,1]
复制代码
楼上说的这个,也是很简洁,如果直接是data.frame,也可以与矩阵相除的。这一行代码,是第一行代码的简洁版哈。

8
johnmy 发表于 2016-7-25 16:59:01
jiangbeilu 发表于 2016-7-24 08:55
这样子也行,就是代码长了点。把第一列扩充成一个矩阵,然后直接矩阵对应元素相除即可。楼上说的这个,也 ...
第二个更简洁,谢谢。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-9 11:53