2016-02-29 72 views
0

我遇到了兩個寫數據框函數的問題。我經常得到一個有2個變量的數據框,我想將它們重新編碼爲一個變量。R:將2個變量重新編碼爲1內部函數

If V1>0 and V2 <0 then new_variable = "V1>0, V2<0. 

在所有的數據框中,我有V1和V2有不同的名稱。

問題編號爲1 我不知道爲什麼test_df $ newVar,該功能後,只得到 「C> 0,I> 0」

#Using test FUN on example data frame 
    test_df.afterFUN <- test_fun(test_df, var1 = "V1", var2 = "V2", newVar = "category") 

問題數2 爲什麼這最後一個參數函數「newVar」不會將名稱更改爲「類別」? 如果我運行此函數擬合到單個數據幀的代碼(重新命名變量和等。)它會工作,並給我什麼,我想(看test_df2)

rm(list = ls()) 
    library("dplyr") # for filter 
    # Preparing example data frame 
    rama <- rbind(c(-5:20, -20:5), c(-20:5, -5:20)) 
    rama <- t(rama) 
    colnames(rama) <- c("V1", "V2") 
    test_df <- as.data.frame(rama) 

#Test FUN 

test_fun <- function(df, var1, var2, newVar) { 
    df1 <- filter(df, var1 == 0, var2 == 0) 
    df1 <- mutate(df1, newVar = "C=0, I=0") 
    df2 <- filter(df, var1 == 0, var2 > 0) 
    df2 <- mutate(df2, newVar = "C=0, I>0") 
    df3 <- filter(df, var1 == 0, var2 < 0) 
    df3 <- mutate(df3, newVar = "C=0, I<0") 
    df4 <- filter(df, var1 > 0, var2 == 0) 
    df4 <- mutate(df4, newVar = "C>0, I=0") 
    df5 <- filter(df, var1 > 0, var2 > 0) 
    df5 <- mutate(df5, newVar = "C>0, I>0") 
    df6 <- filter(df, var1 > 0, var2 < 0) 
    df6 <- mutate(df6, newVar = "C>0, I<0") 
    df7 <- filter(df, var1 < 0, var2 == 0) 
    df7 <- mutate(df7, newVar = "C<0, I=0") 
    df8 <- filter(df, var1 < 0, var2 > 0) 
    df8 <- mutate(df8, newVar = "C<0, I>0") 
    df9 <- filter(df, var1 < 0, var2 < 0) 
    df9 <- mutate(df9, newVar = "C<0, I<0") 
    df <- rbind(df1, df2, df3, df4, df5, df6, df7, df8, df9) 
    return(df) 
    } 

    #Using test FUN on example data frame 
    test_df.afterFUN <- test_fun(test_df, var1 = "V1", var2 = "V2", newVar = "category") 

    # Procedure outside of funcion fitted to test_df 
    df1 <- filter(test_df, V1 == 0, V2 == 0) 
    df1 <- mutate(df1, newVar = "C=0, I=0") 
    df2 <- filter(test_df, V1 == 0, V2 > 0) 
    df2 <- mutate(df2, newVar = "C=0, I>0") 
    df3 <- filter(test_df, V1 == 0, V2 < 0) 
    df3 <- mutate(df3, newVar = "C=0, I<0") 
    df4 <- filter(test_df, V1 > 0, V2 == 0) 
    df4 <- mutate(df4, newVar = "C>0, I=0") 
    df5 <- filter(test_df, V1 > 0, V2 > 0) 
    df5 <- mutate(df5, newVar = "C>0, I>0") 
    df6 <- filter(test_df, V1 > 0, V2 < 0) 
    df6 <- mutate(df6, newVar = "C>0, I<0") 
    df7 <- filter(test_df, V1 < 0, V2 == 0) 
    df7 <- mutate(df7, newVar = "C<0, I=0") 
    df8 <- filter(test_df, V1 < 0, V2 > 0) 
    df8 <- mutate(df8, newVar = "C<0, I>0") 
    df9 <- filter(test_df, V1 < 0, V2 < 0) 
    df9 <- mutate(df9, newVar = "C<0, I<0") 
    test_df2 <- rbind(df1, df2, df3, df4, df5, df6, df7, df8, df9) 

回答

0

這也許可以寫更好,但嘗試:

test_fun <- function(df,col1, col2, newVar) { 
    temp <- sapply(df[,c(col1,col2)],function(x) revalue(factor(sign(x)),c("-1"="<0","0"="=0","1"=">0"))) 
    df[,newVar] <- apply(temp, 1, function(y) paste0(col1,y[1],", ",col2,y[2])) 
    df 
} 

head(test_fun(test_df,"V1", "V2", "category")) 
# V1 V2 category 
# 1 -5 -20 V1<0, V2<0 
# 2 -4 -19 V1<0, V2<0 
# 3 -3 -18 V1<0, V2<0 
# 4 -2 -17 V1<0, V2<0 
# 5 -1 -16 V1<0, V2<0 
# 6 0 -15 V1=0, V2<0 

說明

我們使用sign到柱內獲取每個數字的符號(返回-1,0或1)。然後,我們使用revalue(factor),c())將這些數字重寫爲字符串「< 0」,「= 0」和「> 0」。我們使用sapply將其應用於test_df的兩列。這返回一個字符矩陣。然後,我們將paste應用於每一行以獲取所需的字符向量。最後,我們將該向量分配給test_df$category

+0

謝謝你的回答。你知道如何把這個函數放在funtion中,test_fun(test_df,var1 =「V1」,var2 =「V2」,newVar =「category」),你在哪裏放置數據幀和變量的發言者? –

+0

將代碼重寫爲函數;你可以調整其餘的。 – Laterow

+0

非常感謝,現在我明白了這一點:)! –