R 基于其他列的其他行中的值创建新列

R 基于其他列的其他行中的值创建新列,r,loops,row,multiple-columns,R,Loops,Row,Multiple Columns,我有一个数据框(df),有三列,如下所示: A B C 1 15 -1.60 15 17 -1.49 3 13 2.59 17 18 3.34 我想创建一个新的列“D”,其中每一行都是列“C”中一个值的副本,在其行中,列“a”的值与列“B”的值相等,如果没有相等的值,则输入“NA”;如下所示: A B C D 1 15 -1.6 -1.49 15 17 -1.49 3.34 3 13 2.59 NA 17 1 3.3

我有一个数据框(df),有三列,如下所示:

A   B   C
1   15  -1.60
15  17  -1.49
3   13  2.59
17  18  3.34
我想创建一个新的列“D”,其中每一行都是列“C”中一个值的副本,在其行中,列“a”的值与列“B”的值相等,如果没有相等的值,则输入“NA”;如下所示:

A   B   C   D
1   15  -1.6    -1.49
15  17  -1.49   3.34
3   13  2.59    NA
17  1   3.34    -1.6
我试图编写一个循环,使“C”列变成“D”列,但它不起作用:

for(i in 1:nrow(df)) {
      if (df$B==df$A){
        df$D==df$C
      }else{
        df$D==NA}
    }

有没有什么方法,而不是循环,使这个专栏?如果没有,如何使用循环?

此处不需要循环。很多时候(阅读:大多数情况下),如果您单独使用循环并使用矢量化函数,您将获得更好/更快的结果(在R中)

下面是一个
data.table
方法,使用一个by-reference连接

library( data.table )

df <- fread("A   B   C
1   15  -1.60
15  17  -1.49
3   13  2.59
17  1  3.34")

#or use the code:  setDT( df )

df[ df , D := i.C, on = .(B = A)][]
#     A  B     C     D
# 1:  1 15 -1.60 -1.49
# 2: 15 17 -1.49  3.34
# 3:  3 13  2.59    NA
# 4: 17  1  3.34 -1.60
库(data.table)

df在
base R
中,我们可以使用
match

df$D <- with(df, C[match(B, A)])
数据
df使用
dplyr
package,您可以执行以下操作:

# data 
df <- 
    data.frame(A = c(1, 15, 3, 17), 
               B = c(15, 17, 13, 1), 
               C = c(-1.6, -1.49, 2.59, 3.34))

# code
library(dplyr)
df %>% 
    left_join(df %>% select(A, C) %>% rename(D = C), 
              by = c("B" = "A"))
#数据
df%
左联合(df%%>%选择(A,C)%%>%重命名(D=C),
by=c(“B=A”))
df <- structure(list(A = c(1L, 15L, 3L, 17L), B = c(15, 17, 13, 1), 
    C = c(-1.6, -1.49, 2.59, 3.34)),
    row.names = c(NA, -4L), class = "data.frame")
# data 
df <- 
    data.frame(A = c(1, 15, 3, 17), 
               B = c(15, 17, 13, 1), 
               C = c(-1.6, -1.49, 2.59, 3.34))

# code
library(dplyr)
df %>% 
    left_join(df %>% select(A, C) %>% rename(D = C), 
              by = c("B" = "A"))