楼主: superyxo
2414 10

[问答] R data frame的问题 [推广有奖]

  • 2关注
  • 1粉丝

硕士生

64%

还不是VIP/贵宾

-

威望
0
论坛币
91 个
通用积分
1.0005
学术水平
7 点
热心指数
2 点
信用等级
2 点
经验
9870 点
帖子
93
精华
0
在线时间
199 小时
注册时间
2007-8-28
最后登录
2021-4-15

楼主
superyxo 发表于 2014-12-19 17:26:37 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
假设我的数据 df 里边有三列x, y, 和z:
df <- data.frame(x = runif(10),y = runif(10), z = runif(10))

对于每一行,如果z的值大于x和y里比较小的那个,我需要把x和y里比较小的那个用z的值替换

举例:假设数据里其中一行是这样
x  y  z
3  1 2

这里x和y里比较小的是y,然后用y跟z比较,y还比z小,所以最后y的值被z的值替换,结果是:
x  y  z
3  2  2

如果某一行里z的值比x和y都小,那么保持原样,例如:
x  y  z
3  2  1

这里z是1,比x和y都小,所以没有替换发生,结果还是:
x  y  z
3  2  1

请教各位,这该如何实现。多谢多谢!







二维码

扫码加我 拉你入群

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

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

关键词:Frame Data Fram FRA RAM frame

沙发
jgchen1966 发表于 2014-12-19 19:48:03

myda<-data.frame(x=runif(10),y=runif(10),z=runif(10))
print(myda)
myda<-transform(myda,XLnY=as.integer(x<y))
myda<-transform(myda,x1=(XLnY==1)&(z>x), y1=(XLnY==0)&(z>y))
myda<-transform(myda,x=ifelse(x1,z,x),y=ifelse(y1,z,y))
print(myda)
myda<-myda[,c(1:3)]
print(myda)



已有 1 人评分学术水平 热心指数 信用等级 收起 理由
superyxo + 1 + 1 + 1 精彩帖子

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

藤椅
qoiqpwqr 发表于 2014-12-19 21:04:40
  1. a <- apply(df, 1, function(x) x[3] > min(x[1:2]))
  2. b <- apply(df, 1, function(x) which.min(x[1:2]))
  3. df[cbind(1:nrow(df), b)[a, ]] <- df[a, 3]
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
superyxo + 1 + 1 + 1 精彩帖子

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

板凳
superyxo 发表于 2014-12-20 10:21:26
jgchen1966 发表于 2014-12-19 19:48
myda
谢谢!

报纸
superyxo 发表于 2014-12-20 10:30:47
qoiqpwqr 发表于 2014-12-19 21:04
谢谢!但是我试了下这样好像没法用变量名来做,只能用index。请问如果用变量名x y z来做的话怎么做呢?

因为我的数据不只一个,变量名是固定的,但是每个数据里变量(列)的顺序不一样,所以如果能用变量名代替index来做,就不用每次先查变量对应的列数了,也省了每一次都修改代码。

地板
superyxo 发表于 2014-12-20 11:28:45
qoiqpwqr 发表于 2014-12-19 21:04
把您和jgchen1966二位高人的方法结合了一下,把您的方法变成了用变量名来做,但是我觉得改的有点复杂,请问有没有更简洁的方法,多谢!

a <- apply(df, 1, function(x) x[which(colnames(df) == "z")] > min(x[c(which(colnames(df) == "x"), which(colnames(df) == "y"))]))
b <- apply(df, 1, function(x) ifelse(x[which(colnames(df) == "x")] <= x[which(colnames(df) == "y")], which(colnames(df) == "x"), which(colnames(df) == "y")))

df[cbind(1:nrow(df), b)[a, ]] <- df[a, "z"]
已有 1 人评分论坛币 收起 理由
admin_kefu + 40 根据规定进行奖励

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

7
qoiqpwqr 发表于 2014-12-20 21:15:53
superyxo 发表于 2014-12-20 11:28
把您和jgchen1966二位高人的方法结合了一下,把您的方法变成了用变量名来做,但是我觉得改的有点复杂,请 ...
  1. ind1 <- with(df, pmin(x, y) < z)
  2. ind2 <- with(df, x < y)
  3. df$x[ind1 & ind2] <- df$z[ind1 & ind2]
  4. df$y[ind1 & (! ind2)] <- df$z[ind1 & (! ind2)]
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
superyxo + 1 + 1 + 1 精彩帖子

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

8
superyxo 发表于 2014-12-21 07:40:15
qoiqpwqr 发表于 2014-12-20 21:15
厉害!多谢!

9
jgchen1966 发表于 2014-12-22 10:40:02
superyxo 发表于 2014-12-21 07:40
厉害!多谢!
如果,经常数据“编制与改版”等工作,不如认真学习一下,Package ‘editrules’
想如何改版就如何改版了!!
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
superyxo + 1 + 1 + 1 热心帮助其他会员

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

10
superyxo 发表于 2014-12-22 10:50:57
jgchen1966 发表于 2014-12-22 10:40
如果,经常数据“编制与改版”等工作,不如认真学习一下,Package ‘editrules’
想如何改版就如何改版 ...
多谢多谢!学习了!

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

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