有条件地操作 R Dataframe
Manipulate R Dataframe conditionally
我有一个包含整数的数据框,我想将它们转换为二进制系统(如果你愿意,也可以是三级系统),如果大于 x,则它们变为 1,如果小于 y,则变为 -1,否则为 0。
这是一个示例数据框:
var1 var2 var3
30 13 2
20 29 3
这是我的新数据框的样子(x 是 27,y 是 4):
var1 var2 var3
1 0 - 1
0 1 -1
有简单的方法吗?
这里有一个相对简洁的方法来管理 mutate_all
和 case_when
来自 dplyr
:
x <- 27
y <- 4
df %>% mutate_all(funs(case_when(. > x ~ 1, . < y ~ -1, TRUE ~ 0)))
# var1 var2 var3
# 1 1 0 -1
# 2 0 1 -1
这也可以通过 ifelse
的嵌套应用来完成,尽管它的可扩展性较差(即,如果您的条件列表增长,很快就会变得笨拙):
ifelse(df > x, 1, ifelse(df < y, -1, 0))
虽然你提到你正在做 "tertiary" 编码,也许这就是你所需要的。
这是一个非常快速的基本 R 答案。只要数据集相对于可用 RAM 量相当小,这将非常快。
dat[] <- findInterval(as.matrix(dat), vec = c(4, 27),
rightmost.closed=TRUE) - 1L
此处,由于每一列都有相同的分隔符,因此您将 data.frame 的副本转换为矩阵,并使用这些分隔符将 运行 findInterval
转换为矩阵。 rightmost.closed=TRUE 确保这些值包含在它们的集合中。然后,由于 findInterval
returns 值以 0 开头,因此减去 1 以获得所需的值。
使用dat[] <-
将结果向量放入data.frame。
这个returns
dat
var1 var2 var3
1 1 0 -1
2 0 1 -1
数据
dat <-
structure(list(var1 = c(30L, 20L), var2 = c(13L, 29L), var3 = 2:3),
.Names = c("var1", "var2", "var3"), class = "data.frame",
row.names = c(NA, -2L))
我有一个包含整数的数据框,我想将它们转换为二进制系统(如果你愿意,也可以是三级系统),如果大于 x,则它们变为 1,如果小于 y,则变为 -1,否则为 0。
这是一个示例数据框:
var1 var2 var3
30 13 2
20 29 3
这是我的新数据框的样子(x 是 27,y 是 4):
var1 var2 var3
1 0 - 1
0 1 -1
有简单的方法吗?
这里有一个相对简洁的方法来管理 mutate_all
和 case_when
来自 dplyr
:
x <- 27
y <- 4
df %>% mutate_all(funs(case_when(. > x ~ 1, . < y ~ -1, TRUE ~ 0)))
# var1 var2 var3
# 1 1 0 -1
# 2 0 1 -1
这也可以通过 ifelse
的嵌套应用来完成,尽管它的可扩展性较差(即,如果您的条件列表增长,很快就会变得笨拙):
ifelse(df > x, 1, ifelse(df < y, -1, 0))
虽然你提到你正在做 "tertiary" 编码,也许这就是你所需要的。
这是一个非常快速的基本 R 答案。只要数据集相对于可用 RAM 量相当小,这将非常快。
dat[] <- findInterval(as.matrix(dat), vec = c(4, 27),
rightmost.closed=TRUE) - 1L
此处,由于每一列都有相同的分隔符,因此您将 data.frame 的副本转换为矩阵,并使用这些分隔符将 运行 findInterval
转换为矩阵。 rightmost.closed=TRUE 确保这些值包含在它们的集合中。然后,由于 findInterval
returns 值以 0 开头,因此减去 1 以获得所需的值。
使用dat[] <-
将结果向量放入data.frame。
这个returns
dat
var1 var2 var3
1 1 0 -1
2 0 1 -1
数据
dat <-
structure(list(var1 = c(30L, 20L), var2 = c(13L, 29L), var3 = 2:3),
.Names = c("var1", "var2", "var3"), class = "data.frame",
row.names = c(NA, -2L))