如何根据备用列排列数据

时间:2017-07-22 13:01:23

标签: r

我的数据看起来像这样

df<-structure(list(A = c(0.7, 2.083, 2.517, 2.667, 3.883, 4.5), B = c(111L, 
131747L, 23428L, 12528L, 1055L, 881L), A.1 = c(1.4, 1.65, 2.1, 
2.267, 3.017, 3.383), B.1 = c(2370L, 179289L, 21690L, 10383L, 
816L, 637L), A.2 = c(0.85, 1.633, 2.117, 2.267, 3.567, 5.35), 
    B.2 = c(520L, 54607L, 13677L, 13448L, 1346L, 772L)), .Names = c("A", 
"B", "A.1", "B.1", "A.2", "B.2"), class = "data.frame", row.names = c(NA, 
-6L))

我想从第1,3列开始创建一个独特的列,依此类推 然后将值分配给每个数字(如果没有任何数字,则设置为0)

我想输出如下所示

使问题清楚。首先,我们将第1列看到任何其他奇数列。然后我们找到较小的值,它将成为第一个值(在这种情况下为0.7)然后我们检查偶数列以查看它们的奇数列是否有任何值。所以A是第一个值而B有值,但我们没有看到A.1中的0.7而不是A.2所以它将为零

A,A.1,A.2   B      B.1  B.2
    0.7    111     0    0
    0.85    0      0    520
    1.4     0   2370    0
    1.633   0      0    54607
    1.65    0   179289  0
    2.083   131747  0   0
    2.1    0    21690   0
    2.117   0   0   13677
    2.267   0   10383   13448
    2.517   23428   0   0
    2.667   12528   0   0
    3.017   0      816  0
    3.383   0      637  0
    3.567   0       0   1346
    3.883   1055    0   0
    4.5     881     0   0
    5.35    0   0   772

1 个答案:

答案 0 :(得分:1)

以下是base R

的选项
v1 <-  sort(unique(unlist(df[c(TRUE, FALSE)], use.names = FALSE)))
res <- data.frame(A = v1, mapply(`[`,df[c(FALSE, TRUE)], lapply(df[c(TRUE, FALSE)], 
         function(x) match(v1, x))))
res[is.na(res)] <- 0
res
#        A      B    B.1   B.2
#1  0.700    111      0     0
#2  0.850      0      0   520
#3  1.400      0   2370     0
#4  1.633      0      0 54607
#5  1.650      0 179289     0
#6  2.083 131747      0     0
#7  2.100      0  21690     0
#8  2.117      0      0 13677
#9  2.267      0  10383 13448
#10 2.517  23428      0     0
#11 2.667  12528      0     0
#12 3.017      0    816     0
#13 3.383      0    637     0
#14 3.567      0      0  1346
#15 3.883   1055      0     0
#16 4.500    881      0     0
#17 5.350      0      0   772