我有一个数据帧(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"))