2016-07-30 70 views
-2

我有一組100個變量,從CFM_1到CFM_100。每個變量都可以取1,2,3或4中的任何值。我想創建一個名爲TEMP的新變量,如果任何CFM_1到CFM_100變量的值爲1或2,那麼它將取值1。請幫助我解決此R編程 - 根據基於100個變量的值創建新變量

+0

我編輯根據您的意見我的回答。 – shayaa

+0

非常感謝你們的回答。特別是Shayaa。令人驚歎的。 –

+0

歡迎您點擊答案附近的複選框,選擇一個對您最有幫助的選項。 – shayaa

回答

1

我的例子有點愚蠢,因爲隨機變量在這個矩陣的單個位置生成1或2的概率是1/2。對於矩陣的每一列,執行十次這樣的操作,並且對於任何給定的行,您的臨時變量將爲TRUE的概率小於1%。無論如何,在這裏。

df <- data.frame(replicate(5, sample(1:4, 10, replace = TRUE))) 
names(df) <- paste("CFM", 1:ncol(df), sep = "_") 

您的數據幀看起來像這樣

df 
    CFM_1 CFM_2 CFM_3 CFM_4 CFM_5 
1  2  2  1  4  4 
2  2  2  1  3  4 
3  2  1  1  3  3 
4  1  2  3  3  2 
5  3  4  2  4  4 
6  3  4  4  2  2 
7  3  1  3  2  2 
8  1  2  4  1  2 
9  3  2  1  3  2 
10  1  3  1  4  3 

假設現在,你已經在你的數據幀的其他變量,你想排除。我們將使用cbind將這些列預加入並附加到您的數據框中,如下所示。

df <- cbind(replicate(3,sample(1:4, 10, replace = T)), 
     df, 
     replicate(3,sample(1:4, 10, replace = T))) 
names(df)[1:3]<- paste0("Var",1:3) 
names(df)[9:11] <- paste0("Var", 9:11) 

現在你的DF看起來像這樣

df 
    Var1 Var2 Var3 CFM_1 CFM_2 CFM_3 CFM_4 CFM_5 Var9 Var10 Var11 
1  4 1 4  4  1  3  1  3 1  3  1 
2  4 2 3  2  4  3  2  1 2  3  3 
3  4 2 4  4  2  1  1  2 2  3  2 
4  4 4 2  4  4  1  3  2 2  1  2 
5  4 2 1  4  4  4  1  1 2  2  2 
6  1 4 2  3  1  4  4  2 1  3  2 
7  3 2 4  4  2  3  4  3 1  1  1 
8  1 3 3  3  3  2  3  3 2  2  2 
9  3 3 2  1  4  3  4  1 4  2  1 
10 2 1 1  2  1  2  4  1 2  1  1 

您可以通過應用任何功能,數據的行分配值的變量temp每一行中,檢查是否有任何數據是1或2.但首先你需要找出哪些列是你的數據。

您可以使用agrep函數來執行近似字符串匹配。它會告訴你,你的數據幀的名稱有字符他們"CFM"如果你使用

cfm_cols <-agrep("CFM", names(df)) 
cfm_cols 
[1] 4 5 6 7 8 

temp <- apply(df[,cfm_cols], 1, function(x) any(x) %in% c(1,2)) 
temp 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 

不如預期,他們都是TRUE

另一種解決方法,如果您想,就是用dplyr庫這個

library(dplyr) 
df%>% rowwise() %>% select(contains("CFM")) %>% 
    mutate(TEMP = any(.) %in% c(1,2)) 
+0

就概率評論而言,OP沒有說變量是隨機的。我們不知道這個數據集中值的分佈。小於3的值可能非常罕見。 – rosscova

+0

@rosscova謝謝!我的意思是,「我的榜樣」,而不是「你的榜樣」,因爲我隨機抽樣。無論如何,我想我提供了兩種有效的方法。 – shayaa

+0

啊,我明白了,這是有道理的:)...是的,你的答案是非常有效的,特別是'dplyr',很好的工作。我正在嘗試類似的東西,但無法使其工作。加一個給你。 – rosscova

1

用更有效的解決方案編輯適當的R代碼,部分被盜/從@ shayaa的答案採購...

第一行這裏只提取你感興趣的列(創建一個臨時數據幀我們將在完成後將其刪除):

new <- subset(df, select = paste0("CFM_", seq_len(100))) 

df$TEMP <- 1 * (apply(new, 1, min) <= 2) 

rm(new) 

因此,您只需在每個整行中搜索指定的值,並將布爾結果轉換爲數字,並將其放置到原始數據框中。

+0

抱歉,我無法破譯這個。如果可能的話,請詳細解釋一下。 CFM變量在哪裏出現在這裏? –

+0

對不起,我應該包括一個事實,即我假設您提到的「100個變量」是100列數據框中的列。我提供的代碼查看所有列,因此不需要按名稱調用列。如果有更多的列,你需要從計算中排除,代碼會稍微改變。 – rosscova

+0

是的情況是我有大約300列的數據框,但我只對這些100列感興趣。我明白你的解釋。但是,如果我只想包含我感興趣的語法,可以讓我知道語法上的變化。非常感謝您的幫助。 –

相關問題