【问题标题】:Check the value of all rows in a column to see if it is in a list, return bool value, without for loop检查一列中所有行的值是否在列表中,返回bool值,不用for循环
【发布时间】:2021-03-03 21:37:18
【问题描述】:

我有一个名为“职业”的数据框列,其值为 1、2、3、5、6、7、8、9。我需要构建一个新的数据框列,例如职业 2。如果旧列中的值属于以下元素之一:2、3、6、7,则新列中的行将取值 1。否则,行将取 0。在我的真实数据中,“职业”列可以取大约 90 个不同的值。此外,我需要使用大约 10 个不同的值将 1 分配给新列。所以我不想创建大约 10 个不同的条件来分配新值。

我所做的是创建一个包含值的列表,基于该值我可以对新列进行二分法,例如 value_list = c(2, 3, 6, 7)。我也尽量避免使用 for 循环来完成任务。伪代码如下所示:

df$occupation2 <- 0 
value_list = c(2, 3, 6, 7)
df['occupation2'] <- 1 where occupation2's value isin value_list.  

【问题讨论】:

    标签: r list dataframe recode


    【解决方案1】:

    df[['occupation2']] &lt;- as.integer(df[['occupation']] %in% value_list) 应该可以工作。 %in% 是这项工作的完美操作员。它返回一个logical (TRUE/FALSE) 向量,将被as.integer() 转换为1/0。

    (另外,当从数据框中提取单个列时,请使用data[, column]data[[column]] 直接访问该列 - data[column] 将提供一列数据框,而不仅仅是列)

    【讨论】:

    • 感谢您的帮助。我有一个后续问题。我知道是否 python pandas 数据框。使用 df['col'] 会返回一个数组,而使用 df[['col']] 会返回一个单列 pd 数据框。如果您需要额外的包含多列的“子数据框”,请使用 df[['col1','col2']]。
    • 我的理解是,您将包含您感兴趣的列名称的列表传递给子集括号。但是,我很难理解 R 中的逻辑。此外,在我看来,每当我需要获取布尔向量时,[] 和 [[]] 都可以工作。你能告诉我这件事,或者给我指一个我能完全理解的地方吗?
    • R 不使用['a', 'b'] 作为向量/数组语法,它使用c('a', 'b')。如果您进行该翻译,那么您在 python 中的示例在 R 中几乎完全相同。df['col'] 是一个 1 列数据框,df[['col']] 是一个向量。 df[c('col1', 'col2')] 是一个 2 列数据框,等效于 df[, c('col1, 'col2'])
    • Thx : ) 它澄清了很多困惑。
    猜你喜欢
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多