如何修改数据框的一些但不是所有变量?

时间:2014-02-20 09:26:58

标签: r dataframe

假设有一个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中的变量列表
(例如,将列表中的每个变量与一些其他变量相乘[总是保持不变,
      奖励:或列表中每个变量的变化])?

2 个答案:

答案 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