通过使用R指定列索引来返回行的值

时间:2018-05-15 16:21:30

标签: r dataframe which

我有以下数据框(DF_A):

PARTY_ID O1 O2 O3 O4
P1  0  0 1 0
P2  2  1 0 1
P3  0  0 0 0
P4  2  1 1 1
P5  1  0 0 1

我还有另一个数据帧(DF_B),其中包含我在DF_A中需要的列的位置。这是DF_B:

PARTY_ID POS_1 POS_2
P1  1  2
P2  2  1
P3  3  1
P4  2  1
P5  1  4

我需要给出列的位置(DF_B)以获取DF_A的值。期望的结果是这样的:

PARTY_ID V1 V2
P1 0 0
P2 1 2
P3 0 0
P4 1 2
P5 1 1

我尝试使用哪个功能,但似乎无法正常工作。 谁能帮帮我吗?

SIDE NOTE :我需要以最快的方式执行此操作,因为我的实际数据行数超过100K。

3 个答案:

答案 0 :(得分:1)

使用基础R中的apply执行此操作的快速而肮脏的方法:

DF_C <- apply(DF_A, 1, function(x) {
  cols_to_use <- as.numeric(unlist(DF_B[DF_B$"PARTY_ID"==x["PARTY_ID"],2:3]))
  x[-1][cols_to_use]
}) 
DF_C <- cbind(DF_A$PARTY_ID,t(DF_C))
colnames(DF_C) <- c("PARTY_ID", "V1","V2")

答案 1 :(得分:1)

> ind <- as.matrix(DF_B[,-1])
> t(sapply(1:nrow(ind), function(i) DF_A[, -1][, ind[i,]][i,] ))
     O1 O2
[1,] 0  0 
[2,] 1  2 
[3,] 0  0 
[4,] 1  2 
[5,] 1  1 

如果你想获得data.frame:

> DF <- t(sapply(1:nrow(ind), function(i) DF_A[, -1][, ind[i,]][i,] ))
> data.frame(PARTY_ID=DF_A[,1], DF)
  PARTY_ID O1 O2
1       P1  0  0
2       P2  1  2
3       P3  0  0
4       P4  1  2
5       P5  1  1

答案 2 :(得分:1)

带有简单for循环的那个:

 DF_C <- DF_B        # creating dataframe with same dimension and column/row identifiers

 for(i in 1:nrow(DF_C)) { DF_C[i,] <- DF_A[i,as.numeric(DF_B[i,])] }         #over rows