当前位置: 首页 > 知识库问答 >
问题:

如何根据多列中的值有条件地改变R中的变量?

江佐
2023-03-14

最近没有使用当前tidyverse动词来回答这个问题(R 4.1

library(tidyverse)
set.seed(195)

# create dataframe
response_id <- rep(1:461)
questions <- c("overall","drought","domestic","livestock","distance")
answers <- c("a","b","c","d","e")
colnames <- apply(expand.grid(questions, answers), 1, paste, collapse="_")
df <- tibble(response_id)
# data is actually an unknown mix of TRUE and FALSE values in all columns but just doing that for one column for now for simplicity
df[,colnames] = FALSE
df$overall_a[sample(nrow(df),100)] <- TRUE

# using ifelse and select if to filter which columns to sum
df %>%
 mutate(positive = ifelse(select_if(isTRUE), sum(str_detect(colnames(df), "a|b")), NA)) %>%
 mutate(negative = ifelse(select_if(isTRUE), sum(str_detect(colnames(df), "c|d|e")), NA)) %>%
 select(response_id, positive, negative)

# using case_when
df %>%
 mutate(positive = case_when(TRUE ~ sum(str_detect(colnames(df), "a|b"))), NA) %>%
 mutate(negative = case_when(TRUE ~ sum(str_detect(colnames(df), "c|d|e"))), NA) %>%
 select(response_id, positive, negative)

所需的输出应如下所示。感谢您对此的任何帮助!

# A tibble: 461 × 3
   response_id positive negative
         <int>    <int>    <int>
 1           1       0       0
 2           2       0       0
 3           3       0       0
 4           4       0       0
 5           5       1       0
 6           6       1       0
 7           7       0       0
 8           8       1       0
 9           9       0       0
10          10       1       0
# … with 451 more rows

共有1个答案

红弘盛
2023-03-14

数据放在列名中不被认为是“整洁的”,而“整洁的”最适合整洁的数据。旋转方法将最符合整洁的理念,而不是攻击列名。此外,它将更好地扩展更多类别。例如

df %>% 
  pivot_longer(-response_id) %>% 
  separate(name, into=c("category", "code")) %>% 
  mutate(sentiment=case_when(
    code %in% c("a", "b") ~ "positive", 
    code %in% c("c", "d", "e") ~ "negative")) %>% 
  group_by(response_id, sentiment) %>% 
  summarize(count=sum(value)) %>% 
  pivot_wider(response_id, names_from=sentiment, values_from=count)

它没有那么简洁,但更直接地说明了它在做什么。

但是如果你真的想把数据保留在行名中,你可以使用c_across()和最新的dplyr执行逐行摘要

df %>% 
  rowwise() %>% 
  mutate(
    positive=sum(c_across(ends_with(c("_a", "_b")))),
    negative=sum(c_across(ends_with(c("_c", "_d", "_e"))))) %>% 
  select(response_id, positive, negative)
 类似资料:
  • 我有一个在不同医院接受治疗的病人的数据集(仅限于住院病人),其中一些分析揭示了几个不一致之处。其中之一是--软件允许病人在不关闭他们之前开放的的情况下入院。 为了更好地理解它,让我们考虑一下示例数据集 如果我们在上面的数据中看到,id为1的患者于1月1日在hospital_1(row-1)入院,并于1月14日出院。出院前患者再次在同一医院入院(第2行);在1月15日(第2行)结束这四项记录之前,再

  • 我需要帮助完成一项看似简单的任务。我想基于< code>dplyr::mutate中的一个条件创建几个新变量。我可以使用< code>ifelse创建一个新变量,但是我想一步创建几个。 让我们假设这是我的数据帧。 我想要这样的东西: 因此,if条件应该基于条件< code>y创建三个新变量 我想与< code>if_else和< code>case_when一起使用。 谢谢转发

  • 我对整个数据帧中的标签有两个问题: 我有一个患者的横截面数据集(每行是一个患者)和变量(每列是一个变量)。第一行是变量名,第二行是标签。例如,第1行的BMI和第2行的体重指数。 问题1:如何让R识别第二行是一个标签,而不单独键入每个标签age=age等?有数百个变量需要标记。也许在进口的时候?或者通过将标签分离到不同的数据帧?我似乎找不到一个解决方案,除了为每个变量单独键入它,或者将它放入一个只有

  • 我有这个数据 如果M3大于UCL,MM3将为“UP”,否则为“NULL” 但是我有几个M列(比如m1~m1005),所以我想做一些代码,比如mutate_each和mutate_at。如何使用mutate和ifelse函数在特定条件下创建新列?

  • 我有一个带有几列的。其中一列包含使用货币的符号,例如欧元或美元符号。另一列包含预算值。例如,在一行中,它可能意味着5000欧元的预算,而在下一行中,它可能意味着2000美元的预算。 在熊猫我想添加一个额外的列到我的DataFrame,正常化的欧元预算。所以基本上,对于每一行,如果货币列中的符号是欧元符号,新列中的值应该是预算列中的值*1,新列中的值应该是预算列的值*0.78125如果货币栏中的符号

  • 以下是我需要更改的一些值: 如果第一列是2= 如果第一列是8= 如果第一列是16= 然而,这个命令并不方便,因为它改变了缩进,并且带有8的行似乎不适合: 输出: 您将如何更正更通用的内容(这意味着即使特定行的缩进不同,它也可以工作),并且不会改变原始文件的缩进?