R:将 2 个变量重新编码为 1 个内部函数
R: recoding 2 variables into 1 inside function
我 运行 遇到了两个为数据框编写函数的问题。我经常得到一个包含 2 个变量的数据框,我想将它们重新编码为一个变量。
If V1>0 and V2 <0 then new_variable = "V1>0, V2<0.
在我得到的所有数据框中,V1 和 V2 的名称不同。
问题编号 1。
不知道为什么test_df$newVar,这个函数后得到的只有"C>0, I>0"
#Using test FUN on example data frame
test_df.afterFUN <- test_fun(test_df, var1 = "V1", var2 = "V2", newVar = "category")
问题编号 2。
为什么此函数的最后一个参数 "newVar" 没有将名称更改为 "category"?
如果我 运行 此函数的代码适用于单个数据框(重命名变量等),它将起作用并给我想要的东西(看 test_df2)
rm(list = ls())
library("dplyr") # for filter
# Preparing example data frame
rama <- rbind(c(-5:20, -20:5), c(-20:5, -5:20))
rama <- t(rama)
colnames(rama) <- c("V1", "V2")
test_df <- as.data.frame(rama)
#Test FUN
test_fun <- function(df, var1, var2, newVar) {
df1 <- filter(df, var1 == 0, var2 == 0)
df1 <- mutate(df1, newVar = "C=0, I=0")
df2 <- filter(df, var1 == 0, var2 > 0)
df2 <- mutate(df2, newVar = "C=0, I>0")
df3 <- filter(df, var1 == 0, var2 < 0)
df3 <- mutate(df3, newVar = "C=0, I<0")
df4 <- filter(df, var1 > 0, var2 == 0)
df4 <- mutate(df4, newVar = "C>0, I=0")
df5 <- filter(df, var1 > 0, var2 > 0)
df5 <- mutate(df5, newVar = "C>0, I>0")
df6 <- filter(df, var1 > 0, var2 < 0)
df6 <- mutate(df6, newVar = "C>0, I<0")
df7 <- filter(df, var1 < 0, var2 == 0)
df7 <- mutate(df7, newVar = "C<0, I=0")
df8 <- filter(df, var1 < 0, var2 > 0)
df8 <- mutate(df8, newVar = "C<0, I>0")
df9 <- filter(df, var1 < 0, var2 < 0)
df9 <- mutate(df9, newVar = "C<0, I<0")
df <- rbind(df1, df2, df3, df4, df5, df6, df7, df8, df9)
return(df)
}
#Using test FUN on example data frame
test_df.afterFUN <- test_fun(test_df, var1 = "V1", var2 = "V2", newVar = "category")
# Procedure outside of funcion fitted to test_df
df1 <- filter(test_df, V1 == 0, V2 == 0)
df1 <- mutate(df1, newVar = "C=0, I=0")
df2 <- filter(test_df, V1 == 0, V2 > 0)
df2 <- mutate(df2, newVar = "C=0, I>0")
df3 <- filter(test_df, V1 == 0, V2 < 0)
df3 <- mutate(df3, newVar = "C=0, I<0")
df4 <- filter(test_df, V1 > 0, V2 == 0)
df4 <- mutate(df4, newVar = "C>0, I=0")
df5 <- filter(test_df, V1 > 0, V2 > 0)
df5 <- mutate(df5, newVar = "C>0, I>0")
df6 <- filter(test_df, V1 > 0, V2 < 0)
df6 <- mutate(df6, newVar = "C>0, I<0")
df7 <- filter(test_df, V1 < 0, V2 == 0)
df7 <- mutate(df7, newVar = "C<0, I=0")
df8 <- filter(test_df, V1 < 0, V2 > 0)
df8 <- mutate(df8, newVar = "C<0, I>0")
df9 <- filter(test_df, V1 < 0, V2 < 0)
df9 <- mutate(df9, newVar = "C<0, I<0")
test_df2 <- rbind(df1, df2, df3, df4, df5, df6, df7, df8, df9)
这可能会写得更好,但请尝试:
test_fun <- function(df,col1, col2, newVar) {
temp <- sapply(df[,c(col1,col2)],function(x) revalue(factor(sign(x)),c("-1"="<0","0"="=0","1"=">0")))
df[,newVar] <- apply(temp, 1, function(y) paste0(col1,y[1],", ",col2,y[2]))
df
}
head(test_fun(test_df,"V1", "V2", "category"))
# V1 V2 category
# 1 -5 -20 V1<0, V2<0
# 2 -4 -19 V1<0, V2<0
# 3 -3 -18 V1<0, V2<0
# 4 -2 -17 V1<0, V2<0
# 5 -1 -16 V1<0, V2<0
# 6 0 -15 V1=0, V2<0
说明
我们使用 sign
来获取列中每个数字的符号(returns -1、0 或 1)。然后,我们使用 revalue(factor),c())
将这些数字重写为字符串“<0”、“=0”和“>0”。我们使用 sapply
将其应用于 test_df
的两列。这returns一个字符矩阵。然后,我们将 paste
应用于每一行以获得所需的字符向量。最后,我们将该向量分配给 test_df$category
.
我 运行 遇到了两个为数据框编写函数的问题。我经常得到一个包含 2 个变量的数据框,我想将它们重新编码为一个变量。
If V1>0 and V2 <0 then new_variable = "V1>0, V2<0.
在我得到的所有数据框中,V1 和 V2 的名称不同。
问题编号 1。 不知道为什么test_df$newVar,这个函数后得到的只有"C>0, I>0"
#Using test FUN on example data frame
test_df.afterFUN <- test_fun(test_df, var1 = "V1", var2 = "V2", newVar = "category")
问题编号 2。 为什么此函数的最后一个参数 "newVar" 没有将名称更改为 "category"? 如果我 运行 此函数的代码适用于单个数据框(重命名变量等),它将起作用并给我想要的东西(看 test_df2)
rm(list = ls())
library("dplyr") # for filter
# Preparing example data frame
rama <- rbind(c(-5:20, -20:5), c(-20:5, -5:20))
rama <- t(rama)
colnames(rama) <- c("V1", "V2")
test_df <- as.data.frame(rama)
#Test FUN
test_fun <- function(df, var1, var2, newVar) {
df1 <- filter(df, var1 == 0, var2 == 0)
df1 <- mutate(df1, newVar = "C=0, I=0")
df2 <- filter(df, var1 == 0, var2 > 0)
df2 <- mutate(df2, newVar = "C=0, I>0")
df3 <- filter(df, var1 == 0, var2 < 0)
df3 <- mutate(df3, newVar = "C=0, I<0")
df4 <- filter(df, var1 > 0, var2 == 0)
df4 <- mutate(df4, newVar = "C>0, I=0")
df5 <- filter(df, var1 > 0, var2 > 0)
df5 <- mutate(df5, newVar = "C>0, I>0")
df6 <- filter(df, var1 > 0, var2 < 0)
df6 <- mutate(df6, newVar = "C>0, I<0")
df7 <- filter(df, var1 < 0, var2 == 0)
df7 <- mutate(df7, newVar = "C<0, I=0")
df8 <- filter(df, var1 < 0, var2 > 0)
df8 <- mutate(df8, newVar = "C<0, I>0")
df9 <- filter(df, var1 < 0, var2 < 0)
df9 <- mutate(df9, newVar = "C<0, I<0")
df <- rbind(df1, df2, df3, df4, df5, df6, df7, df8, df9)
return(df)
}
#Using test FUN on example data frame
test_df.afterFUN <- test_fun(test_df, var1 = "V1", var2 = "V2", newVar = "category")
# Procedure outside of funcion fitted to test_df
df1 <- filter(test_df, V1 == 0, V2 == 0)
df1 <- mutate(df1, newVar = "C=0, I=0")
df2 <- filter(test_df, V1 == 0, V2 > 0)
df2 <- mutate(df2, newVar = "C=0, I>0")
df3 <- filter(test_df, V1 == 0, V2 < 0)
df3 <- mutate(df3, newVar = "C=0, I<0")
df4 <- filter(test_df, V1 > 0, V2 == 0)
df4 <- mutate(df4, newVar = "C>0, I=0")
df5 <- filter(test_df, V1 > 0, V2 > 0)
df5 <- mutate(df5, newVar = "C>0, I>0")
df6 <- filter(test_df, V1 > 0, V2 < 0)
df6 <- mutate(df6, newVar = "C>0, I<0")
df7 <- filter(test_df, V1 < 0, V2 == 0)
df7 <- mutate(df7, newVar = "C<0, I=0")
df8 <- filter(test_df, V1 < 0, V2 > 0)
df8 <- mutate(df8, newVar = "C<0, I>0")
df9 <- filter(test_df, V1 < 0, V2 < 0)
df9 <- mutate(df9, newVar = "C<0, I<0")
test_df2 <- rbind(df1, df2, df3, df4, df5, df6, df7, df8, df9)
这可能会写得更好,但请尝试:
test_fun <- function(df,col1, col2, newVar) {
temp <- sapply(df[,c(col1,col2)],function(x) revalue(factor(sign(x)),c("-1"="<0","0"="=0","1"=">0")))
df[,newVar] <- apply(temp, 1, function(y) paste0(col1,y[1],", ",col2,y[2]))
df
}
head(test_fun(test_df,"V1", "V2", "category"))
# V1 V2 category
# 1 -5 -20 V1<0, V2<0
# 2 -4 -19 V1<0, V2<0
# 3 -3 -18 V1<0, V2<0
# 4 -2 -17 V1<0, V2<0
# 5 -1 -16 V1<0, V2<0
# 6 0 -15 V1=0, V2<0
说明
我们使用 sign
来获取列中每个数字的符号(returns -1、0 或 1)。然后,我们使用 revalue(factor),c())
将这些数字重写为字符串“<0”、“=0”和“>0”。我们使用 sapply
将其应用于 test_df
的两列。这returns一个字符矩阵。然后,我们将 paste
应用于每一行以获得所需的字符向量。最后,我们将该向量分配给 test_df$category
.