假设我有以下数据集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)
有没有一种优雅的方式来解决这个问题?
答案 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