楼主: dxystata
1744 7

[问答] 如何写循环实现 [推广有奖]

版主

已卖:302份资源

大师

37%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
183395 个
通用积分
15333.1475
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
298627 点
帖子
5586
精华
1
在线时间
13632 小时
注册时间
2006-6-21
最后登录
2025-12-22

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

楼主
dxystata 发表于 2013-4-26 23:35:23 |AI写论文
50论坛币
数据框中有y x1 x2 x3,myfun<-function(xvar) {
循环实现将x1 x2 x3变成factor
}
myfunc(xvar="x1 x2 x3")
谢谢!

最佳答案

qoiqpwqr 查看完整内容

> dat str(dat) 'data.frame': 10 obs. of 4 variables: $ y : num 1.318 0.731 0.274 -0.488 -0.431 ... $ x1: int 1 2 3 4 5 6 7 8 9 10 $ x2: int 2 3 4 5 6 7 8 9 10 11 $ x3: int 3 4 5 6 7 8 9 10 11 12 > > myfun dat str(dat) 'data.frame': 10 obs. of 4 variables: $ y : num 1.318 0.731 0.274 -0.488 -0.431 ... $ x1: Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
关键词:如何写 Fun 数据框 如何

回帖推荐

ntsean 发表于4楼  查看完整内容

如果要覆盖原来 x1 x2 x3的话 myfunc

沙发
qoiqpwqr 发表于 2013-4-26 23:35:24
> dat <- data.frame(y=rnorm(10), x1=1:10, x2=2:11, x3=3:12)
> str(dat)
'data.frame':   10 obs. of  4 variables:
$ y : num  1.318 0.731 0.274 -0.488 -0.431 ...
$ x1: int  1 2 3 4 5 6 7 8 9 10
$ x2: int  2 3 4 5 6 7 8 9 10 11
$ x3: int  3 4 5 6 7 8 9 10 11 12
>
> myfun <- function(dat, xvar) {
+     for (colid in xvar) {
+         dat[, colid] <- as.factor(dat[, colid])
+ }
+     return(dat)
+ }
>
> dat <- myfun(dat, c("x1", "x2", "x3"))
> str(dat)
'data.frame':   10 obs. of  4 variables:
$ y : num  1.318 0.731 0.274 -0.488 -0.431 ...
$ x1: Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10
$ x2: Factor w/ 10 levels "2","3","4","5",..: 1 2 3 4 5 6 7 8 9 10
$ x3: Factor w/ 10 levels "3","4","5","6",..: 1 2 3 4 5 6 7 8 9 10
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
famousid + 1 + 1 + 1 观点有启发

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

藤椅
ntsean 发表于 2013-4-27 03:26:54
myfunc <- function(data, xvar) {
        xv <- strsplit(xvar, " ")[[1]]
        xvfactor <- as.data.frame(lapply(xv, function(x) factor(eval(as.name(x), envir=data))))
        names(xvfactor) <- paste(xv, ".factor", sep="")
        cbind(data, xvfactor)
}


data <- data.frame(y=rnorm(100), x1=sample(1:3, 100, replace=T),
                         x2=sample(2:5, 100, replace=T), x3=sample(1:4, 100, replace=T))

newdata <- myfunc(data, "x1 x2 x3")

head(newdata)

newdata$x1.factor
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
famousid + 1 + 1 + 1 观点有启发
dxystata + 50 + 1 + 1 好的意见建议

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

板凳
ntsean 发表于 2013-4-27 03:31:40
如果要覆盖原来 x1 x2 x3的话

myfunc <- function(data, xvar) {
        xv <- strsplit(xvar, " ")[[1]]
        xvfactor <- as.data.frame(lapply(xv, function(x) factor(eval(as.name(x), envir=data))))
        data[, xv] <- xvfactor
        data
}


data <- data.frame(y=rnorm(100), x1=sample(1:3, 100, replace=T),
                         x2=sample(2:5, 100, replace=T), x3=sample(1:4, 100, replace=T))

newdata <- myfunc(data, "x1 x2 x3")

head(newdata)

newdata$x1
已有 1 人评分经验 热心指数 收起 理由
dxystata + 50 + 1 好的意见建议

总评分: 经验 + 50  热心指数 + 1   查看全部评分

报纸
dxystata 发表于 2013-4-27 09:19:29
ntsean 发表于 2013-4-27 03:31
如果要覆盖原来 x1 x2 x3的话

myfunc
xv <- strsplit(xvar, " ")[[1]]
[[1]] 能否解释一下呢?谢谢!

地板
ntsean 发表于 2013-4-27 10:14:03
dxystata 发表于 2013-4-27 09:19
xv
strsplit是把"x1 x2 x3"变成 "x1" "x2" "x3", 这个取决你想如何输入xvar
如果直接是个vector,比如 c("x1", "x2", "x3") 那这个strsplit就没必要了
如果是象你帖子里面输入"x1 x2 x3"那就需要先提取哪些变量

7
dxystata 发表于 2013-4-27 10:24:16
ntsean 发表于 2013-4-27 10:14
strsplit是把"x1 x2 x3"变成 "x1" "x2" "x3", 这个取决你想如何输入xvar
如果直接是个vector,比如 c("x ...
xv <- strsplit(xvar, " ")[[1]]
我的意思是为什么后面要加上[[1]]?谢谢!

8
ntsean 发表于 2013-4-27 10:50:28
dxystata 发表于 2013-4-27 10:24
xv
因为strsplit返回的是list
用[[1]]就是把list里面的vector提出来

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

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