通过列名搜索数据帧值,并获取相应的匹配值列

时间:2016-06-22 05:39:28

标签: r

    Date_Time   C   4700C   Put.15  4800C   Put.16  4900C   Put.17
1   20120531    NA  NA  NA  NA  NA  NA  NA
2   20120601 1445   4800    208 84.9    143.3   119.8   92  167
3   20120606 1100   4900    268.85  43  192 66.3    127 100
4   20120607 1500   5000    345 24  261 38.25   183 60.5
5   20120612 1515   NA  NA  NA  NA  NA  NA  NA

我有上面的示例数据框,这里我想在所有列名中搜索C列的第1行的值,并获取匹配列的值作为结果。 例如< - 想要搜索第二行C列的值4900,在第一个所有列名称中,一旦找到4900C,就会得到结果,作为第二行的4900C中的所有值。

请帮忙

1 个答案:

答案 0 :(得分:0)

如果数据中的分隔符清晰,那会更好。例如,"Date_Time"作为列名可以将元素"20120531 NA"作为字符串。

我们使用names删除'df1'的sub(基于'j2'的子集),使用'C'删除match的非数字子字符串列索引('j1'),根据NA值('i1')得到一个逻辑索引,然后用row/column索引,我们从建议列中提取元素(df1 [ - (1:3) ]`)并将其分配给“NewCol”。

j2 <- grep("\\d+C", names(df1))
j1 <-  match(df1$C, sub("\\D+", "", names(df1)[j2]))
i1 <- !is.na(j1)
df1$NewCol[i1] <- df1[j2][cbind((1:nrow(df1))[i1], j1[i1])]
df1
#       Date Time    C  4700C Put.15 4800C Put.16 4900C Put.17 NewCol
#1 20120531   NA   NA     NA     NA    NA     NA    NA     NA     NA
#2 20120601 1445 4800 208.00   84.9 143.3 119.80    92  167.0  143.3
#3 20120606 1100 4900 268.85   43.0 192.0  66.30   127  100.0  127.0
#4 20120607 1500 5000 345.00   24.0 261.0  38.25   183   60.5     NA
#5 20120612 1515   NA     NA     NA    NA     NA    NA     NA     NA

注意:这里我假设'时间'是第二列

数据

df1 <- structure(list(Date = c(20120531L, 20120601L, 20120606L, 20120607L, 
20120612L), Time = c(NA, 1445L, 1100L, 1500L, 1515L), C = c(NA,  
4800L, 4900L, 5000L, NA), `4700C` = c(NA, 208, 268.85, 345, NA
), Put.15 = c(NA, 84.9, 43, 24, NA), `4800C` = c(NA, 143.3, 192, 
261, NA), Put.16 = c(NA, 119.8, 66.3, 38.25, NA), `4900C` = c(NA, 
92L, 127L, 183L, NA), Put.17 = c(NA, 167, 100, 60.5, NA)), 
.Names = c("Date", 
"Time", "C", "4700C", "Put.15", "4800C", "Put.16", "4900C", "Put.17"
), class = "data.frame", row.names = c("1", "2", "3", "4", "5"))