我有一个数据框,格式为:
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
答案 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)
一种方法是将rep
与each
参数一起使用,该参数根据要过滤的行数而变化
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)