2017-06-15 130 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 
相关问题