在R中使用%in%运算符作为分类变量

时间:2018-01-17 21:30:45

标签: r

尝试在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;?感谢您的时间解释原因和可能的解决方法。

3 个答案:

答案 0 :(得分:1)

这是你想要做的吗?

df <- data.frame(A=seq(1:4), B=seq(1:4))

enter image description here

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')

enter image description here

答案 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在你花费太多时间编写自己的函数之前,你可能想要探索一些已存在于carHmisc等地方的重新编码函数。

根据您的重新编码的复杂程度,您的功能将变得越来越长,以检查各种边界条件或更改数据类型。

根据您的示例,您可以在基础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)