r-根据其他列的其他行中的值创建一个新列



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

A   B   C
1   15  -1.60
15  17  -1.49
3   13  2.59
17  18  3.34

我想做一个新的专栏,";D";其中每一行是列"中的值的副本;C、 ";在其行中为列"0";A";具有与列"的值相等的值;B";,并且如果不存在相等的值put";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

我试着写一个循环;D";列从";C";列,但不起作用:

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

除了循环之外,还有什么方法可以制作这个专栏吗?如果没有,我如何使用循环?

此处不需要循环。很多时候(阅读:大多数时候(,如果你只考虑循环并使用矢量化函数,你会得到更好/更快的结果(在R中(。

这里有一个data.table方法,使用一个参考连接

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

base R中,我们可以使用match

df$D <- with(df, C[match(B, A)])

-输出

df
#   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

数据

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")

使用dplyr包,您可以执行以下操作:

# 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"))

相关内容

  • 没有找到相关文章

最新更新