楼主: maiweijie4321
1247 8

[问答] 各位师兄,昨晚有时间看了下R函数编程,遇到个问题,是否可以解答下,问题是这样的: [推广有奖]

  • 0关注
  • 0粉丝

硕士生

0%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0.2148
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
817 点
帖子
65
精华
0
在线时间
147 小时
注册时间
2017-12-6
最后登录
2021-4-14

楼主
maiweijie4321 发表于 2019-12-17 16:52:34 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
各位师兄,昨晚有时间看了下R函数编程,遇到个问题,是否可以解答下,问题是这样的:
一个数据文件,如下所示,使用-99 表示缺失值。 我想把所有的-99都替换成 NA,
于是编个简单的函数实现:
f <- function(x) {
x[x == -99] <- NA
}
假如产生数据:
set.seed(1014)
df <- data.frame(replicate(6, sample(c(1:10, -99), 6, rep = TRUE)))
names(df) <- letters[1:6]
但应用上述函数df$d<-f(df$d)得到d列全部是NA.
我用C语言同样的方法会得到正确的结果。why?

二维码

扫码加我 拉你入群

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

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


沙发
megapanda 发表于 2019-12-17 19:50:48
你的函数f返回值是NA,请把函数改为
  1. f <- function(x) {
  2.     x[x == -99] <- NA
  3.     x
  4. }
复制代码
已有 1 人评分论坛币 收起 理由
cheetahfly + 10 精彩帖子

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

藤椅
maiweijie4321 发表于 2019-12-18 08:34:04
megapanda 发表于 2019-12-17 19:50
你的函数f没有返回值,请把函数改为
按你讲的方法确实可以了。但请问一下,函数一定要有返回值吗?我运用语句x[x==-99]<-99明明已经赋值了,按道理相应的位置是NA,其它位置不变啊。求解?

板凳
maiweijie4321 发表于 2019-12-18 08:37:03
megapanda 发表于 2019-12-17 19:50
你的函数f没有返回值,请把函数改为
另外,如果没有显示返回值,R不是默认最后一句(这里是x[x==-99]<-NA)为返回值吗?

报纸
megapanda 发表于 2019-12-18 12:59:56
maiweijie4321 发表于 2019-12-18 08:37
另外,如果没有显示返回值,R不是默认最后一句(这里是x[x==-99]
第1个问题,x[x == -99] <- NA 的赋值是在函数中完成的,您可以简单理解为两者所处的环境(environment)不同。而在函数环境的变量值改变,不会影响全局环境的变量(除非该变量没有在函数中定义);

第2个问题,我之前的描述确实有点问题,
R的确将函数的最后一句作为返回值,但最后一句(x[x==-99] <- NA)的值是NA ,您可以尝试在控制台执行
    print(x[x==-99] <- NA)
将会打印出NA而不是x

地板
maiweijie4321 发表于 2019-12-18 14:29:16
megapanda 发表于 2019-12-18 12:59
第1个问题,x[x == -99]
有点明白了。多谢!

7
maiweijie4321 发表于 2019-12-18 14:37:27
megapanda 发表于 2019-12-18 12:59
第1个问题,x[x == -99]
我现在有另外一个问题,不知道您是否可以帮忙解答,问题是这样的:
创建一个 pick()函数,传入一个索引 i 作为一个参数,并返回一个带有一个参数 x 的函数,它使用 i 对 x 进行取子集操作。
我编写函数这样:
pick<-function(i){
  function(dt)df
f<-pick(5)
;例如我要去数据框iris的第5列,运行f(iris)报错。求解?

8
megapanda 发表于 2019-12-19 13:25:33
maiweijie4321 发表于 2019-12-18 14:37
我现在有另外一个问题,不知道您是否可以帮忙解答,问题是这样的:
创建一个 pick()函数,传入一个索引  ...
没有看懂你的pick的定义.不过如果只是要去掉第i列,可以直接
    df <- df[-i]

如果要实现这个pick,可以如下定义:
  1. pick = function(i){
  2.   function(df) df[-i]
  3. }
复制代码

9
maiweijie4321 发表于 2019-12-24 10:22:42
megapanda 发表于 2019-12-19 13:25
没有看懂你的pick的定义.不过如果只是要去掉第i列,可以直接
    df
非常感谢!

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

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