将 data.frame 中的值替换为下一列中的值
Replace value in data.frame with value in next column
我有两列数据框:
names duration
1 J 97
2 G NA
3 H 53
4 A 23
5 E NA
6 D NA
7 C 73
8 F NA
9 B 37
10 I 67
我想要做的是将持续时间列中的所有 NA 值替换为同一行中名称列中的值。我怎样才能做到这一点?
我们可以使用 is.na
创建一个逻辑索引,然后在 'i1' 的基础上对 'names' 进行子集替换同一行上的 'duration'。
i1 <- is.na(df$duration)
df$duration[i1] <- df$names[i1]
df
# names duration
#1 J 97
#2 G G
#3 H 53
#4 A 23
#5 E E
#6 D D
#7 C 73
#8 F F
#9 B 37
#10 I 67
注意:这应该将 'duration' 的 class
从 numeric
更改为 character
或者这可以通过 data.table
更快的方法来完成。将'data.frame'转换为'data.table'(setDT(df)
),将'duration'的class
转换为character
,然后通过在[=39中指定条件=](is.na(duration)
),我们将'name'中对应'i'条件的值赋值(:=
)给'duration'。由于分配发生在适当的地方,它将非常有效。
library(data.table)
setDT(df)[, duration:= as.character(duration)][is.na(duration), duration:= names]
数据
df <- structure(list(names = c("J", "G", "H", "A", "E", "D", "C", "F",
"B", "I"), duration = c(97L, NA, 53L, 23L, NA, NA, 73L, NA, 37L,
67L)), .Names = c("names", "duration"), row.names = c("1", "2",
"3", "4", "5", "6", "7", "8", "9", "10"), class = "data.frame")
数据
zz <- "names duration
1 J 97
2 G NA
3 H 53
4 A 23
5 E NA
6 D NA
7 C 73
8 F NA
9 B 37
10 I 67"
df <- read.table(text = zz, header = TRUE)
dplyr
的解决方案
library(dplyr)
df_new <- df %>%
mutate(duration = ifelse(is.na(duration), as.character(names), duration))
输出
df_new
# names duration
# 1 J 97
# 2 G G
# 3 H 53
# 4 A 23
# 5 E E
# 6 D D
# 7 C 73
# 8 F F
# 9 B 37
# 10 I 67
我有两列数据框:
names duration
1 J 97
2 G NA
3 H 53
4 A 23
5 E NA
6 D NA
7 C 73
8 F NA
9 B 37
10 I 67
我想要做的是将持续时间列中的所有 NA 值替换为同一行中名称列中的值。我怎样才能做到这一点?
我们可以使用 is.na
创建一个逻辑索引,然后在 'i1' 的基础上对 'names' 进行子集替换同一行上的 'duration'。
i1 <- is.na(df$duration)
df$duration[i1] <- df$names[i1]
df
# names duration
#1 J 97
#2 G G
#3 H 53
#4 A 23
#5 E E
#6 D D
#7 C 73
#8 F F
#9 B 37
#10 I 67
注意:这应该将 'duration' 的 class
从 numeric
character
或者这可以通过 data.table
更快的方法来完成。将'data.frame'转换为'data.table'(setDT(df)
),将'duration'的class
转换为character
,然后通过在[=39中指定条件=](is.na(duration)
),我们将'name'中对应'i'条件的值赋值(:=
)给'duration'。由于分配发生在适当的地方,它将非常有效。
library(data.table)
setDT(df)[, duration:= as.character(duration)][is.na(duration), duration:= names]
数据
df <- structure(list(names = c("J", "G", "H", "A", "E", "D", "C", "F",
"B", "I"), duration = c(97L, NA, 53L, 23L, NA, NA, 73L, NA, 37L,
67L)), .Names = c("names", "duration"), row.names = c("1", "2",
"3", "4", "5", "6", "7", "8", "9", "10"), class = "data.frame")
数据
zz <- "names duration
1 J 97
2 G NA
3 H 53
4 A 23
5 E NA
6 D NA
7 C 73
8 F NA
9 B 37
10 I 67"
df <- read.table(text = zz, header = TRUE)
dplyr
library(dplyr)
df_new <- df %>%
mutate(duration = ifelse(is.na(duration), as.character(names), duration))
输出
df_new
# names duration
# 1 J 97
# 2 G G
# 3 H 53
# 4 A 23
# 5 E E
# 6 D D
# 7 C 73
# 8 F F
# 9 B 37
# 10 I 67