R:制作" as.factor"在动态数据集上

时间:2015-12-04 12:34:39

标签: r

假设我有以下数据集ds:

a, b, c, d, ...
1, 1, 1, 1, ...
0, 1, 0, 1, ...
1, 0, 1, 1, ...
0, 0, 1, 1, ...
1, 0, 0, 0, ...

现在为了使列成为as.factor,我所要做的就是:

ds$a <- as.factor(ds$a)

问题是当我不知道我有多少列时。所以我想在length(ds)上使用for循环,但我无法动态访问ds $ a。我已经尝试了ds[names(ds)[i]] <- as.factor(ds[names(ds)[i]]),但我收到了以下错误:

Error in sort.list(y) : 'x' must be atomic for 'sort.list'
Have you called 'sort' on a list?

任何人都可以对此有所了解吗?

我解决不好的另一个问题如下:假设我不希望第一列和最后一列受到影响。我所做的是

df[,3:length(engdata) - 1] <- lapply(df[,3:length(df) - 1], as.factor)

有没有一种优雅的方式来解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果您知道列的索引,则可以执行以下操作:

WARNING:  RXTX Version mismatch
    Jar version = RXTX-2.2-20081207 Cloudhopper Build rxtx.cloudhopper.net
    native lib Version = RXTX-2.1-7pre16
>>> Gateway Status change for modem.com4, OLD: STOPPED -> NEW: RESTART
>>> Gateway Status change for modem.com4, OLD: RESTART -> NEW: STOPPING
>>> Gateway Status change for modem.com4, OLD: STOPPING -> NEW: STOPPED
org.smslib.GatewayException: Comm library exception: java.lang.RuntimeException: gnu.io.NoSuchPortException
    at org.smslib.modem.SerialModemDriver.connectPort(SerialModemDriver.java`enter code here`:102)
    at org.smslib.modem.AModemDriver.connect(AModemDriver.java:114)
    at org.smslib.modem.ModemGateway.startGateway(ModemGateway.java:189)
    at org.smslib.Service$1Starter.run(Service.java:277)**

(使用Robert在评论中提出的lapply-magic)

你的for循环也会起作用(你只是缺少括号)

ds[names(ds)[2:3]] <- lapply(ds[names(ds)[2:3]], as.factor)

注意

之间的区别
for (i in 2:3) {
   ds[[names(ds)[i]]] <- as.factor(ds[[names(ds)[i]]])
}

> str(ds[2])
'data.frame':   5 obs. of  1 variable:
$ b: num  1 0 0 0 0