动态创建新列,其中iin新列根据其名称LHS变为0且RHS保持不变

时间:2016-10-06 04:19:04

标签: r

我的数据集(nm)包含以下列:

nm

   X24_TT_1.1   X35_FTT_2.1  X55_FTT_3.1  X70_FTT_4.1  X1085_TT_5.1 Mean    Median
    0.09          0.87        0.89          0.15        0.1          35      55
    0.94          0.12        0.09          0.92        0.82         55      55
    0.89          0.11        0.86          0.08        0.08         70      35 
    0.12          0.8         0.15          0.18        0.12         35      35
    0.08          0.09        0.15          0.88        0.12         85      24

我希望有以下条件的新数据集(df):

a)无论平均值和中位数之间的最高值,新列将LHS值显示为“0”,RHS应具有相同的先前值。

b)新列必须在其最后一个列名称中添加“_P”

c)由于列数非常大,因此需要动态编码

例如

在第1行:当55> 35然后选择55作为阈值并将X55_TT设置为列,其中具有名称/值即X24_TT和X35_TT即24和35小于55的列应显示“0”作为值和列大于55即X_70_FTT& X_1085TT将显示相同的先前值。

类似于第3行:70> 35,它应该在70(LHS)之前显示“0”,在70之后显示之前的值(RHS)

新数据集(df)将显示如下:

df

X24_TT_1.1  X35_FTT_2.1  X55_FTT_3.1  X70_FTT_4.1  X1085_TT_5.1 Mean    Median  X24_TT___1.1_P  X35_FTT_2.1_P   X55_FTT__3.1_P  X70_FTT__4.1_P  X1085_TT_5.1_P
0.09        0.87          0.89         0.15       0.1           35       55       0                0              0.89             0.15            0.1
0.94        0.12          0.09         0.92       0.82          55       55       0                0              0.09             0.92            0.82
0.89        0.11          0.86         0.08       0.08          70       35       0                0              0                0.08            0.08
0.12        0.8           0.15         0.18       0.12          35       35       0                0.8           0.15              0.18            0.12
0.08        0.09          0.15         0.88       0.12          85       24       0                0               0                 0            0.12

我尝试了几种方法,但动态编码对我不起作用。

提前感谢您提供解决方案!!

1 个答案:

答案 0 :(得分:0)

一种选择是使用gsub(' j1')从列名中提取数字子字符串,循环遍历行(apply(nm, 1, ...),获取最大值'意思是'和'中位数' (i1),将前5个元素分配给0,其中' j1'小于' i1',对前5个值进行子集,转置输出并将其分配给新列。

j1 <- as.numeric(gsub("\\D+", "", names(nm)[1:5]))
nm[paste0(names(nm)[1:5], "_P")] <- t(apply(nm, 1, FUN = function(x) {
        i1 <- max(x[6:7])
        x[1:5][j1 < i1] <- 0
        x[1:5] 

     }))

nm    
# X24_TT X35_FTT X55_FTT X70_FTT X85_TT Mean Median X24_TT_P X35_FTT_P
#1   0.09    0.87    0.89    0.15   0.10   35     55        0       0.0
#2   0.94    0.12    0.09    0.92   0.82   55     55        0       0.0
#3   0.89    0.11    0.86    0.08   0.08   70     35        0       0.0
#4   0.12    0.80    0.15    0.18   0.12   35     35        0       0.8
#5   0.08    0.09    0.15    0.88   0.12   85     24        0       0.0
#  X55_FTT_P X70_FTT_P X85_TT_P
#1      0.89      0.15     0.10
#2      0.09      0.92     0.82
#3      0.00      0.08     0.08
#4      0.15      0.18     0.12
#5      0.00      0.00     0.12

或者我们可以使用rep进行矢量化,创建一个逻辑矩阵,乘以前面的5列&#39; nm&#39;并将输出分配给新列

res <- nm[1:5]*matrix(rep(j1, nrow(nm)) >= rep(do.call(pmax, nm[6:7]), 
                            each = 5), ncol=5, byrow=TRUE)
nm[paste0(names(nm)[1:5], "_P")] <- res
nm
#X24_TT X35_FTT X55_FTT X70_FTT X85_TT Mean Median X24_TT_P X35_FTT_P X55_FTT_P X70_FTT_P X85_TT_P
#1   0.09    0.87    0.89    0.15   0.10   35     55        0       0.0      0.89      0.15     0.10
#2   0.94    0.12    0.09    0.92   0.82   55     55        0       0.0      0.09      0.92     0.82
#3   0.89    0.11    0.86    0.08   0.08   70     35        0       0.0      0.00      0.08     0.08
#4   0.12    0.80    0.15    0.18   0.12   35     35        0       0.8      0.15      0.18     0.12
#5   0.08    0.09    0.15    0.88   0.12   85     24        0       0.0      0.00      0.00     0.12

更新

对于新列名称,请更改&#39; j1&#39;到

j1 <- as.numeric(sub("\\D+(\\d+)_.*", "\\1", names(nm)[1:5]))

并复制粘贴上面的代码给出

res <- nm[1:5]*matrix(rep(j1, nrow(nm)) >= rep(do.call(pmax, nm[6:7]), 
                            each = 5), ncol=5, byrow=TRUE)
nm[paste0(names(nm)[1:5], "_P")] <- res
nm
#   X24_TT_1.1 X35_FTT_2.1 X55_FTT_3.1 X70_FTT_4.1 X1085_TT_5.1 Mean Median X24_TT_1.1_P X35_FTT_2.1_P X55_FTT_3.1_P X70_FTT_4.1_P X1085_TT_5.1_P
#1       0.09        0.87        0.89        0.15         0.10   35     55            0           0.0          0.89          0.15           0.10
#2       0.94        0.12        0.09        0.92         0.82   55     55            0           0.0          0.09          0.92           0.82
#3       0.89        0.11        0.86        0.08         0.08   70     35            0           0.0          0.00          0.08           0.08
#4       0.12        0.80        0.15        0.18         0.12   35     35            0           0.8          0.15          0.18           0.12
#5       0.08        0.09        0.15        0.88         0.12   85     24            0           0.0          0.00          0.00           0.12

数据

nm <- structure(list(X24_TT = c(0.09, 0.94, 0.89, 0.12, 0.08), X35_FTT = c(0.87, 
0.12, 0.11, 0.8, 0.09), X55_FTT = c(0.89, 0.09, 0.86, 0.15, 0.15
), X70_FTT = c(0.15, 0.92, 0.08, 0.18, 0.88), X85_TT = c(0.1, 
0.82, 0.08, 0.12, 0.12), Mean = c(35L, 55L, 70L, 35L, 85L), Median = c(55L, 
55L, 35L, 35L, 24L)), .Names = c("X24_TT", "X35_FTT", "X55_FTT", 
"X70_FTT", "X85_TT", "Mean", "Median"), class = "data.frame", 
row.names = c(NA, -5L))