根据其他列的其他行中的值创建一个新列
Make a new column based on values in other rows of other 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.34 -1.6
我尝试编写一个循环从“C”列生成“D”列,但它不起作用:
for(i in 1:nrow(df)) {
if (df$B==df$A){
df$D==df$C
}else{
df$D==NA}
}
有什么方法可以不用循环来制作这个专栏吗?如果没有,我该如何使用循环?
这里不需要循环。很多时候(阅读:大部分时间)如果你单独使用 for 循环并使用向量化函数,你将得到 better/faster 结果(在 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"))
我有一个包含以下三列的数据框 (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}
}
有什么方法可以不用循环来制作这个专栏吗?如果没有,我该如何使用循环?
这里不需要循环。很多时候(阅读:大部分时间)如果你单独使用 for 循环并使用向量化函数,你将得到 better/faster 结果(在 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"))