尝试在r中使用%in%运算符来查找等效的SAS代码,如下所示:
If weather in (2,5) then new_weather=25;
else if weather in (1,3,4,7) then new_weather=14;
else new_weather=weather;
SAS代码将生成变量" new_weather"值为25,14,如变量" weather"中所定义。
R代码:
GS <- function(df, col, newcol){
# Pass a dataframe, col name, new column name
df[newcol] = df[col]
df[df[newcol] %in% c(2,5)]= 25
df[df[newcol] %in% c(1,3,4,7)] = 14
return(df)
}
结果:&#34; col&#34;的输出值和&#34; newcol&#34;当通过函数&#34; GS&#34;传递数据帧时,它们是相同的。语法没有获取变量的第二个或更多值&#34; newcol&#34;?感谢您的时间解释原因和可能的解决方法。
答案 0 :(得分:1)
这是你想要做的吗?
df <- data.frame(A=seq(1:4), B=seq(1:4))
add_and_adjust <- function(df, copy_column, new_column_name) {
df[new_column_name] <- df[copy_column] # make copy of column
df[,new_column_name] <- ifelse(df[,new_column_name] %in% c(2,5), 25, df[,new_column_name])
df[,new_column_name] <- ifelse(df[,new_column_name] %in% c(1,3,4,7), 14, df[,new_column_name])
return(df)
}
用法:
add_and_adjust(df, 'B', 'my_new_column')
答案 1 :(得分:0)
df[newcol]
是一个数据框(有一列),df[[newcol]]
或df[, newcol]
是一个向量(只是列)。您需要在此使用[[
。
您还需要将结果分配给df[[newcol]]
,而不是整个df
。为了完全一致和安全,您应该测试col
值,而不是newcol
值。
GS <- function(df, col, newcol){
# Pass a dataframe, col name, new column name
df[[newcol]] = df[[col]]
df[[newcol]][df[[col]] %in% c(2,5)] = 25
df[[newcol]][df[[col]] %in% c(1,3,4,7)] = 14
return(df)
}
GS(data.frame(x = 1:7), "x", "new")
# x new
# 1 1 14
# 2 2 25
# 3 3 14
# 4 4 14
# 5 5 25
# 6 6 6
# 7 7 14
答案 2 :(得分:0)
@ user9231640在你花费太多时间编写自己的函数之前,你可能想要探索一些已存在于car
和Hmisc
等地方的重新编码函数。
根据您的重新编码的复杂程度,您的功能将变得越来越长,以检查各种边界条件或更改数据类型。
根据您的示例,您可以在基础R中执行此操作,并且它将在一个级别上更加自我记录和透明:
df <- data.frame(A=seq(1:30), B=seq(1:30))
df$my_new_column <- df$B
df$my_new_column <- ifelse(df$my_new_column %in% c(2,5), 25, df$my_new_column)
df$my_new_column <- ifelse(df$my_new_column %in% c(1,3,4,7), 14, df$my_new_column)