如何为使用%in%运算符选择的行分配值向量

时间:2019-06-03 07:17:19

标签: r dataframe

我有一个数据框,格式为:

X <- c(1, 2, 3, 4, 5, 6, 7)
V1 <- c("CHE", "CHE", "CHE", "FRA", "FRA", "FRA", "FRA")
V2 <- c("String1", "String2", "String2", "String1", "String3", "String4", "String3")
V3 <- c("String5", "String5", "String5", "String6", "String6", "String7", "String7")

df <- data.frame(X, V1, V2, V3)

如何使用X %in% c(2, 4, 5)选择基于X的行,然后在数据框中分配字符串向量?

我尝试过:

 df[df$X %in% c(2, 4, 5), c(2:4)] <- c("CHE", "Lago Maggiore", "X")

但是它不能像预期的那样工作:

 X            V1            V2            V3
1           CHE       String1       String5
2           CHE           CHE           CHE
3           CHE       String2       String5
4 Lago Maggiore Lago Maggiore Lago Maggiore
5             X             X             X
6           FRA       String4       String7
7           FRA       String3       String7

预期结果将是:

X            V1            V2            V3
1           CHE       String1       String5
2           CHE Lago Maggiore             X
3           CHE       String2       String5
4           CHE Lago Maggiore             X
5           CHE Lago Maggiore             X
6           FRA       String4       String7
7           FRA       String3       String7

2 个答案:

答案 0 :(得分:3)

确保列属于“字符”类:

df <- data.frame(X, V1, V2, V3, stringsAsFactors = FALSE)

Data.frames是列向量的列表。如果要分配给多列,请传递列表(或data.frame)而不是字符向量:

df[df$X %in% c(2, 4, 5), c(2:4)] <- list("CHE", "Lago Maggiore", "X")

#  X  V1            V2      V3
#1 1 CHE       String1 String5
#2 2 CHE Lago Maggiore       X
#3 3 CHE       String2 String5
#4 4 CHE Lago Maggiore       X
#5 5 CHE Lago Maggiore       X
#6 6 FRA       String4 String7
#7 7 FRA       String3 String7

答案 1 :(得分:1)

一种方法是将repeach参数一起使用,该参数根据要过滤的行数而变化

df[df$X %in% c(2, 4, 5), 2:4] <- rep(c("CHE", "Lago Maggiore", "X"), each = 3)

df
#  X  V1            V2      V3
#1 1 CHE       String1 String5
#2 2 CHE Lago Maggiore       X
#3 3 CHE       String2 String5
#4 4 CHE Lago Maggiore       X
#5 5 CHE Lago Maggiore       X
#6 6 FRA       String4 String7
#7 7 FRA       String3 String7

数据

X <- c(1, 2, 3, 4, 5, 6, 7)
V1 <- c("CHE", "CHE", "CHE", "FRA", "FRA", "FRA", "FRA")
V2 <- c("String1", "String2", "String2", "String1", "String3", "String4", "String3")
V3 <- c("String5", "String5", "String5", "String6", "String6", "String7", "String7")
df <- data.frame(X, V1, V2, V3, stringsAsFactors = FALSE)