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

具有相同茎名的多列R dplyr

黄查猛
2023-03-14

当相应的列>0时,我需要将一些数据列设置为NA。

(x<-data.frame(x1=(1:4),map.x1=c(0,0,7,0),x2=c(2,2,2,2),map.x2=c(0,7,0,0)))

mutate(x, x1=ifelse(map.x1>0, NA, x1))

mutate_at(x, vars(starts_with("x")), function(v) { 
  m.name <- paste0("map.", deparse(substitute(v)))
  ifelse(get(m.name)>0, NA, v)
  )
}

我也在考虑重塑,这样我就可以做一个变异。这里最好的做法是什么?

共有1个答案

江永安
2023-03-14

下面是一种获得所需输出的方法。不需要编写自定义函数。重新塑造文件应该就足够了。

library(tibble)
library(dplyr)
library(stats)

# creating dataframe with proper names
x <-
  tibble::as_data_frame(cbind(
    x_1 = c(1:4),
    map.x_1 = c(0, 0, 7, 0),
    x_2 = c(2, 2, 2, 2),
    map.x_2 = c(0, 7, 0, 0)
  )) %>%
  tibble::rownames_to_column(df = ., var = 'id')

# converting to long format
x_long <- stats::reshape(
  as.data.frame(x),
  timevar = "level",
  varying = dput(as.character(as.vector(names(
    x[, base::grep("^x|^map", names(x))]
  )))),
  direction = "long",
  idvar = c("id"),
  sep = "_"
)
#> c("x_1", "map.x_1", "x_2", "map.x_2")

# converting the dataframe based on condition
x_long %>%
  group_by(.data = ., level) %>%
  dplyr::mutate(.data = .,
                x = base::ifelse(test = map.x > 0,
                                 yes = NA,
                                 no = x))
#> # A tibble: 8 x 4
#> # Groups:   level [2]
#>   id    level     x map.x
#>   <chr> <dbl> <dbl> <dbl>
#> 1 1      1.00  1.00  0   
#> 2 2      1.00  2.00  0   
#> 3 3      1.00 NA     7.00
#> 4 4      1.00  4.00  0   
#> 5 1      2.00  2.00  0   
#> 6 2      2.00 NA     7.00
#> 7 3      2.00  2.00  0   
#> 8 4      2.00  2.00  0

在2018-02-14由reprex包(V0.1.1.9000)创建。

 类似资料:
  • 问题内容: 我的MySQL数据库中有这些表: 通用表: Facebook表: 首席表: 基本上,常规表包含一些( 显然 )常规数据。基于generalTable.scenario,您可以在其他两个表中查找更多详细信息,这些表在某些熟悉的列中(例如,expiresAt),而在其他一些列中则不然。 我的问题是,如何仅通过一个查询就可以获取generalTable和正确的明细表的联接数据。 所以,我想这

  • 问题内容: 我是Swift的新手,我已经遍历了一些教程,其中许多教程使用同一个名称多次定义了一个函数。 我已经习惯了其他编程语言,否则将无法执行此操作。 因此,我检查了官方的Swift手册,还检查了override关键字,以了解可以得到的结果,但是仍然无法理解以下代码: 从我看到的函数tableView设置在第1行和第5行,我注意到的唯一区别是第一个tableView函数返回,而第二个函数返回(U

  • 我正在使用的数据库有许多具有相同列但(显然)具有不同表名的表(不是我设计的)。例如(这些是数据库表名): 有没有可能用JPA和Hibernate将这些映射到一个Java类实体?类的名称是,然后在使用它时传入例如,以便对象使用表? 还是只使用普通的、普通的Java对象来完成这样的任务更好? 谢谢你!

  • 我正在运行以下JOOQ查询: table和joinTable都有id作为主键名称,但最终获取实体类包含joinTable的id和table的其余列。如果我重新排序表,结果相似,我有表的ID和joinTable的其余列。

  • 问题内容: 我试图找到具有重复值,但仅基于选定的列数,而不是单个列或整个行的行。例如,如果我的表如下所示: 我的问题是: 查找行的“地址和状态”字段与另一行的“地址和状态”字段匹配的行的所有ID。 该查询的答案将是: 有任何想法吗? 意见建议: 如何从单个表中选择同一行中的多列值 问题答案: 请尝试以下方法:

  • 我有一个示例数据集,如下所示 Col1 Col2 Col3 A 1,2,3 A123 A 4,5 A456 A 1,2,3 A456 A 4,5 A123 我参考了一些解决方案,并尝试了以下方法。但它只追加单个列。