2017-06-15 123 views
2

我有一個如下所示的數據幀「df」。第一列是樣本。我想根據其他列中的值創建一個新列。如何基於數據框中其他列中的值創建新列?

Input: 

Sample Region4 Region1 Region5 Region3 Region2 Type 
T1  0  0.289 0.378 0  1  K 
T2  0  0.167  0  0.875 0.389 K 
T3 0.186  0.12345 0  0  0.187 K 
T4 0.11234  0.1789 0  0.457 0.786 L 
T5 0.2347  0.2567 0  0  0  L 
T6 0.28769  0  0.123 0.1987 0.1565 L 
T7 0.142  0  0.1987 0  0  M 
T8  0  0.1256 0.123 0.129 0.111 M 
T9 0.187  0.987  0  0.237 0.783 M 

在「新」列「0」應當被如果樣品示出在區域中的至少一個和「2」的值< 0.2如果樣品示出在數值> = 0.2應分配分配至少有一個地區。它應該看起來像以下:

輸出:

Sample Region4 Region1 Region5 Region3 Region2 Type New 
T1  0  0.289 0.378 0  1  K  2 
T2  0  0.167  0  0.875 0.389 K  2 
T3 0.186  0.12345 0  0  0.187 K  0 
T4 0.11234  0.1789 0  0.457 0.786 L  2 
T5 0.2347  0.2567 0  0  0  L  2 
T6 0.28769  0  0.123 0.1987 0.1565 L  2 
T7 0.142  0  0.1987 0  0  M  0 
T8  0  0.1256 0.123 0.129 0.111 M  0 
T9 0.187  0.987  0  0.237 0.783 M  2 

回答

1

我們可以通過矢量化的方式與rowSums

nm1 <- startsWith(names(df1), "Region") 
df1$New <- c(0, 2)[(rowSums(df1[nm1] >=0.2) !=0)+1] 
df1$New 
#[1] 2 2 0 2 2 2 0 0 2 

或者另一種選擇用做Reduce

c(0, 2)[Reduce(`|`, lapply(df1[nm1], `>=`, 0.2)) + 1] 
#[1] 2 2 0 2 2 2 0 0 2 
+0

嘿,謝謝。這是按行進行的,但是我希望這是列明智的,然後在「新建」列中分配值。你能告訴我該怎麼做。 – raju

+0

@raju似乎你的預期輸出是基於行邏輯 – akrun

+0

是的,但你能告訴我如何給它列明智的邏輯.. Thankyou – raju

0

基本上我用Add a variable to a data frame containing max value of each row來獲得每一行的最大值,然後用一個ifelse來得到新列

 > so1=read.csv("so1.csv") 
     > so1 
      Sample Region4 Region1 Region5 Region3 Region2 Type 
     1  T1 0.00000 0.28900 0.3780 0.0000 1.0000 K 
     2  T2 0.00000 0.16700 0.0000 0.8750 0.3890 K 
     3  T3 0.18600 0.12345 0.0000 0.0000 0.1870 K 
     4  T4 0.11234 0.17890 0.0000 0.4570 0.7860 L 
     5  T5 0.23470 0.25670 0.0000 0.0000 0.0000 L 
     6  T6 0.28769 0.00000 0.1230 0.1987 0.1565 L 
     7  T7 0.14200 0.00000 0.1987 0.0000 0.0000 M 
     8  T8 0.00000 0.12560 0.1230 0.1290 0.1110 M 
     9  T9 0.18700 0.98700 0.0000 0.2370 0.7830 M 


    > so1$new1=do.call(pmax,so1[2:6]) 
    > so1 
     Sample Region4 Region1 Region5 Region3 Region2 Type new1 
    1  T1 0.00000 0.28900 0.3780 0.0000 1.0000 K 1.00000 
    2  T2 0.00000 0.16700 0.0000 0.8750 0.3890 K 0.87500 
    3  T3 0.18600 0.12345 0.0000 0.0000 0.1870 K 0.18700 
    4  T4 0.11234 0.17890 0.0000 0.4570 0.7860 L 0.78600 
    5  T5 0.23470 0.25670 0.0000 0.0000 0.0000 L 0.25670 
    6  T6 0.28769 0.00000 0.1230 0.1987 0.1565 L 0.28769 
    7  T7 0.14200 0.00000 0.1987 0.0000 0.0000 M 0.19870 
    8  T8 0.00000 0.12560 0.1230 0.1290 0.1110 M 0.12900 
    9  T9 0.18700 0.98700 0.0000 0.2370 0.7830 M 0.98700 

> so1$New=ifelse(so1$new1>=0.2,2,0) 
> so1 
    Sample Region4 Region1 Region5 Region3 Region2 Type new1 New 
1  T1 0.00000 0.28900 0.3780 0.0000 1.0000 K 1.00000 2 
2  T2 0.00000 0.16700 0.0000 0.8750 0.3890 K 0.87500 2 
3  T3 0.18600 0.12345 0.0000 0.0000 0.1870 K 0.18700 0 
4  T4 0.11234 0.17890 0.0000 0.4570 0.7860 L 0.78600 2 
5  T5 0.23470 0.25670 0.0000 0.0000 0.0000 L 0.25670 2 
6  T6 0.28769 0.00000 0.1230 0.1987 0.1565 L 0.28769 2 
7  T7 0.14200 0.00000 0.1987 0.0000 0.0000 M 0.19870 0 
8  T8 0.00000 0.12560 0.1230 0.1290 0.1110 M 0.12900 0 
9  T9 0.18700 0.98700 0.0000 0.2370 0.7830 M 0.98700 2 
> so1$new1=NULL 
> so1 
    Sample Region4 Region1 Region5 Region3 Region2 Type New 
1  T1 0.00000 0.28900 0.3780 0.0000 1.0000 K 2 
2  T2 0.00000 0.16700 0.0000 0.8750 0.3890 K 2 
3  T3 0.18600 0.12345 0.0000 0.0000 0.1870 K 0 
4  T4 0.11234 0.17890 0.0000 0.4570 0.7860 L 2 
5  T5 0.23470 0.25670 0.0000 0.0000 0.0000 L 2 
6  T6 0.28769 0.00000 0.1230 0.1987 0.1565 L 2 
7  T7 0.14200 0.00000 0.1987 0.0000 0.0000 M 0 
8  T8 0.00000 0.12560 0.1230 0.1290 0.1110 M 0 
9  T9 0.18700 0.98700 0.0000 0.2370 0.7830 M 2 
相關問題