全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
2316 10
2014-12-19
假设我的数据 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

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







二维码

扫码加我 拉你入群

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

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

全部回复
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)



二维码

扫码加我 拉你入群

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

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

2014-12-19 21:04:40
复制代码
二维码

扫码加我 拉你入群

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

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

2014-12-20 10:21:26
jgchen1966 发表于 2014-12-19 19:48
myda
谢谢!
二维码

扫码加我 拉你入群

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

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

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

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

扫码加我 拉你入群

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

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

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"]
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群