[英]Assign observations to a group based on another vector in the same R dataframe
我正在尝试根据网格正方形ID将区域分配给R中的数据框中的观察值。 我有以下数据框( df ):
year month square
1 2000 2 A1
2 2000 2 B2
3 2000 2 H5
4 2000 2 J9
5 2000 2 A2
6 2000 3 N8
7 2000 3 M9
8 2000 3 C7
我想为“区域”添加另一列,根据网格正方形将每个观测值分配给“北部”,“东部”,“南部”或“西部”。 我试过下面的for循环它什么也没做,
for(i in 1:length(df$square)) {
for(j in 1:length(N)) {
if(df$square[i]==N[j]){
df$area[i]=="N"}
}
}
for(i in 1:length(df$square)) {
if(any(df$square==N)==T){
df$area[i]=="North"}
}
其中“ N”是我创建的对象,其中包含位于北部的正方形,即:
N <- c("A1","A2","B2")
我确实找到了以下相关问题,但是我想知道涉及字符时是否有所不同: 根据R中的另一列分配一个组号
任何帮助,将不胜感激。 谢谢
我建议不要再定义像N
这样的向量,而是推荐使用第二个data.frame
配对具有面积的正方形:
df <- data.frame(year = 2000,
month = c(2,2,2,2,2,3,3,3),
square = c("A1", "B2", "H5", "J9", "A2", "N8", "M9", "C7"),
stringsAsFactors = FALSE)
areas <- data.frame(square = c("A1", "A2", "B1", "H5", "J9", "M9", "N8"),
area = c("N", "N", "N", "W", "E", "S", "S"),
stringsAsFactors = FALSE)
这样,只需合并即可:
merge(df, areas, by = "square", all.x = TRUE)
# square year month area
# 1 A1 2000 2 N
# 2 A2 2000 2 N
# 3 B2 2000 2 <NA>
# 4 C7 2000 3 <NA>
# 5 H5 2000 2 W
# 6 J9 2000 2 E
# 7 M9 2000 3 S
# 8 N8 2000 3 S
( NA
的原因是areas
定义不完整。)
d <- data.frame(year = rep(2000, 8), month = rep(3,8),
square = c("A1", "B2", "H5", "J9", "A2", "N8", "M9", "C7"))
N <- c("A1","A2","B2")
for(i in 1:nrow(d)) {
if (d$square[i] %in% N) {
d$area[i] <- "North"
}
else (
d$area[i] <- "Somewhere Else"
)
}
for循环中的else if()语句中的图层,用于其他基本方向ID向量
在R中,通常最好避免循环,尤其是嵌套循环。 对于这种情况,我更喜欢sapply()
。
N <- c("A1","A2","B2")
#assume these are the other designations
S <- c("H5", "J9")
E <- c("N8","M9")
W <- c("C7")
mydat$area<- sapply(mydat$square, function (x){
if (x %in% N) return("North")
if (x %in% S) return("South")
if (x %in% E) return("East")
if (x %in% W) return("West")
else NA
})
mydat
year month square area
2000 2 A1 North
2000 2 B2 North
2000 2 H5 South
2000 2 J9 South
2000 2 A2 North
2000 3 N8 East
2000 3 M9 East
2000 3 C7 West
当你开始有大型数据集, *apply()
函数会比R.循环更快
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.