2013-07-03 50 views
5

我有一個數據框,並且想要將所有列(比如說,取日誌或其他)與具有特定名稱的列進行轉換。所以在下面的例子中,我想記錄X.1和X.2的日誌,但不是Y或Z.1。高效地轉換數據幀的多列

df <- data.frame(
    Y = sample(0:1, 10, replace = TRUE), 
    X.1 = sample(1:10), 
    X.2 = sample(1:10), 
    Z.1 = sample(151:160) 
) 

# option 1, won't work for dozens of fields 
df$X.1 <- log(df$X.1) 
df$X.2 <- log(df$X.2) 

當數據框是幾個千兆字節時,是否有一個好的,有效的方法來做到這一點?

回答

18

在將返回一個data.frame函數的情況:

cols <- c("X.1","X.2") 
df[cols] <- log(df[cols]) 

否則,你將需要使用lapply或在列的循環。這些解決方案將比上述解決方案慢,所以只有在必要時才使用它們。

df[cols] <- lapply(df[cols], function(x) c(NA,diff(x))) 
for(col in cols) { 
    df[col] <- c(NA,diff(df[col])) 
} 
+0

第一種方法對於我現在需要的呼叫來說似乎很棒,謝謝。很明顯,我不知道爲什麼我沒有想到它。 – chmullig

6
vars <- c("X.1", "X.2") 

df[vars] <- lapply(df[vars], log) 
+0

當接受的解決方案沒有嘗試將as.integer應用於數據框時,此工作適用於我。 – sage88

0
df <- data.frame(
Y = sample(0:1, 10, replace = TRUE), 
X.1 = sample(1:10), 
X.2 = sample(1:10), 
Z.1 = sample(151:160) 
) 
df 

假設你知道這需要真正的數據幀轉換這些變量(2和3指的是第二和第三變量DF這是X.1和X.2)

df2=log10(df[c(2:3)]) 
df2 

如果變量遠遠屬於數據框的一部分,您可以在第1,3,6,8至10和13行中選擇它們,如c(1,3,6,8:10,13)。這僅適用於數值變量。