首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >整洁: create key without rowwise()?

整洁: create key without rowwise()?
EN

Stack Overflow用户
提问于 2019-04-01 21:44:30
回答 3查看 122关注 0票数 3

是否有一种方法可以在不使用rowwise()的情况下创建key

任何指针都是非常受欢迎的。

代码语言:javascript
运行
复制
df <- tibble(grp1=rev(LETTERS[1:5]),grp2=letters[11:15],grp3=LETTERS[1:5],
      value=rnorm(5,10,10))

df %>% rowwise %>% mutate(key=paste(sort(c(grp1, grp2)), collapse="")) %>% ungroup()
代码语言:javascript
运行
复制
  grp1  grp2  grp3  value             key  
  <chr> <chr> <chr> <chr>             <chr>
1 E     k     A     -3.73984194875213 AE   
2 D     l     B     3.25846392371014  BD   
3 C     m     C     3.62405652088127  CC   
4 B     n     D     6.41520621902784  BD   
5 A     o     E     20.1892413026407  AE 

更新:tibble包含多个字符向量,但key应该从列grp1grp3生成。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-01 23:16:15

这是一个使用pmin/pmap的矢量化选项。将列'grp1‘、'grp3’的每一行的min/maxpmin/pmax并连接在一起(str_c)

代码语言:javascript
运行
复制
library(dplyr)
library(stringr)
df %>%
   mutate(key = str_c(pmin(grp1, grp3), pmax(grp1, grp3)))
# A tibble: 5 x 5
#  grp1  grp2  grp3   value key  
#  <chr> <chr> <chr>  <dbl> <chr>
#1 E     k     A      24.7  AE   
#2 D     l     B       5.66 BD   
#3 C     m     C      16.3  CC   
#4 B     n     D       5.88 BD   
#5 A     o     E      -9.22 AE   

数据

代码语言:javascript
运行
复制
df <- tibble(grp1=rev(LETTERS[1:5]),grp2=letters[11:15],grp3=LETTERS[1:5],
          value=rnorm(5,10,10))

注意:cbind转换为matrix,矩阵只能包含单个类。通过使用as_tibble转换为tibble,不会自动更改类。相反,直接使用tibble/data.frame而不是cbind路由

票数 2
EN

Stack Overflow用户

发布于 2019-04-01 21:50:48

使用purrr::pmap_chr

代码语言:javascript
运行
复制
library(tidyverse)
df %>% mutate(key=pmap_chr(.[c("grp1","grp3")],~paste(sort(c(...)), collapse="")))
# # A tibble: 5 x 5
#   grp1  grp2  grp3  value             key  
#   <chr> <chr> <chr> <chr>             <chr>
# 1 E     k     A     22.0150932758833  AE   
# 2 D     l     B     2.24725610156698  BD   
# 3 C     m     C     -6.2414882455089  CC   
# 4 B     n     D     22.5699168856552  BD   
# 5 A     o     E     -6.21443670571301 AE 

在base R中,你可以这样做:

代码语言:javascript
运行
复制
transform(df, key=mapply(function(...) paste(sort(c(...)), collapse=""), grp1, grp3)
票数 3
EN

Stack Overflow用户

发布于 2019-04-01 21:58:55

另一种方法是使用mutate,不使用rowwise,但使用函数的矢量化版本,如下所示:

代码语言:javascript
运行
复制
library(dplyr)

# create a function and vectorise it
f = function(x, y) paste(sort(c(x, y)), collapse="")
f = Vectorize(f)

# use the function
df %>% mutate(key = f(grp1, grp3))

# # A tibble: 5 x 5
#   grp1  grp2  grp3  value             key  
#   <chr> <chr> <chr> <chr>             <chr>
# 1 E     k     A     -4.41213449814982 AE   
# 2 D     l     B     10.4314736952111  BD   
# 3 C     m     C     5.69345098226371  CC   
# 4 B     n     D     4.39266020802413  BD   
# 5 A     o     E     22.0623810028979  AE
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55456651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档