2013-07-03 17 views
5

के कई कॉलम कुशलतापूर्वक रूपांतरित करें मेरे पास डेटा फ्रेम है, और मैं एक निश्चित नाम से मेल खाने वाले कॉलम के साथ सभी कॉलम (कहें, लॉग या जो कुछ भी) को बदलना चाहता हूं। तो नीचे दिए गए उदाहरण में, मैं एक्स .1 और एक्स 2 का लॉग लेना चाहता हूं, लेकिन वाई या जेड 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 

यह सोचते हैं कि आप उन चर जो वास्तविक dataframe में कन्वर्जन होना आवश्यक है पता

df2=log10(df[c(2:3)]) 
df2 
(2 और 3 2 और df में 3 चर जो X.1 और X.2 हैं को संदर्भित करता है)

यदि वेरिएबल्स डेटाफ्रेम में बहुत अधिक भाग हैं तो आप उन्हें 1, 3, 6 वें 8 से 10 और 13 वें के लिए सी (1,3,6,8: 10,13) चुन सकते हैं। यह केवल संख्यात्मक चर के लिए काम करता है ।