假设有一个data.frame,其中一些变量被编码为整数:
a <- c(1,2,3,4,5)
b <- as.integer(c(2,3,4,5,6))
c <- as.integer(c(5,1,0,9,2))
d <- as.integer(c(5,6,7,3,1))
e <- c(2,6,1,2,3)
df <- data.frame(a,b,c,d,e)
str(df)
假设我想将b到d的列转换为数字:
varlist <- names(df)[2:4]
lapply(varlist, function(x) {
df$x <- as.numeric(x, data=x)
})
str(df)
不起作用。
我试过了:
df$b <- as.numeric(b, data=df)
df$c <- as.numeric(c, data=df)
df$d <- as.numeric(d, data=df)
str(df)
工作正常。
问题:
我该怎么做(用lapply
循环或更好,[但我是Stata人,因此习惯于写循环])?
更一般地说:如何将任何函数应用于data.frame中的变量列表
(例如,将列表中的每个变量与一些其他变量相乘[总是保持不变,
奖励:或列表中每个变量的变化])?
答案 0 :(得分:1)
对于第一个问题,您可以使用sapply
:
df[2:4] <- sapply(df[2:4],as.numeric)
对于第二个你应该使用mapply
。例如,将3个变量(2到4)乘以3个不同的随机标量:
df[2:4] <- mapply(function(x,y)df[[x]]*y,2:4,rnorm(3))
答案 1 :(得分:0)
df[,2:4] <- sapply(df[,2:4], as.numeric)
关于你的第二个问题,如果你想说列c乘以5
df$c <- df$c * 5
或者与c长度相同的任何向量,可能是新列乘以c乘以d
df$cd <- df$c * df$d