根据列名转换数据帧值

时间:2015-02-27 12:29:44

标签: r dataframe

我们有一个像这样的data.frame:

ID 10_1 2_20 [...]
1    1   1   [...]
2    2   1   [...]

我们需要根据列的名称更改数据框的值。例如,在第1行中,列10_1将获得值1,因为10大于" 10_1"中的值。但是第1行中的第2_20列将获得值0,因为2在" 2_20"中小于20。

如何迭代数据框并根据列的名称更改每行中列的值?

谢谢

1 个答案:

答案 0 :(得分:1)

您可以尝试

indx <- (vapply(strsplit(names(df1)[-1], '_'), function(x) {
           x1 <- as.numeric(x)
           x1[1] >x1[2]}, logical(1L)))+0L
df1[-1] <- indx[col(df1[-1])]
df1
#  ID 10_1 2_20
#1  1    1    0
#2  2    1    0

或者您可以尝试sub

 v1 <- as.numeric(sub('_.*', '', names(df1)[-1]))
 v2 <- as.numeric(sub('.*_', '', names(df1)[-1]))
 indx <- (v1 >v2)+0L
  df1[-1] <- indx[col(df1[-1])]

数据

df1 <- structure(list(ID = 1:2, `10_1` = 1:2, `2_20` = c(1L, 1L)),
.Names = c("ID","10_1", "2_20"), class = "data.frame",
row.names = c(NA, -2L))