【问题标题】:Is there an R function that can replace a nominal values for certain numeric values within a particular range in a dataframe是否有一个 R 函数可以替换数据框中特定范围内某些数值的标称值
【发布时间】:2021-12-30 19:25:01
【问题描述】:

给定下面的数据框

     A    B    C
A    0    3   1.1
B   3.1   0    .9
C    2    2.1   0

以及下面的值键

Label  Num
w      0
x      1
y      2
z      3

如何生成输出

     A    B    C
A    w    z    x
B    z    w    x
C    y    y    w

【问题讨论】:

  • 请展示您迄今为止尝试过的内容以及您的不足之处。话虽如此,我认为您正在寻找cut

标签: r dataframe function matrix operation


【解决方案1】:

data.table 接近

library(data.table)
#make them data.tables, keep rownames
setDT(df, keep.rownames = "id")
setDT(df2)
# melt to long format
df.melt <- melt(df, id.vars = "id", variable.name = "id2", variable.factor = FALSE)
# perform rolling join
df.melt[, new_value := df2[df.melt, Label, on = .(Num = value), roll = Inf]]
# cast to wide again
dcast(df.melt, id ~ id2, value.var = "new_value")

   id A B C
1:  A w z x
2:  B z w w
3:  C y y w

样本数据

df <- read.table(text = "     A    B    C
A    0    3   1.1
B   3.1   0    .9
C    2    2.1   0", header = TRUE)

df2 <- read.table(text = "Label  Num
w      0
x      1
y      2
z      3", header = TRUE)

【讨论】:

    【解决方案2】:

    Dplyr 方法:

    library(dplyr)
    library(tidyr)
    
    df <- tibble(rownames=c("A", "B", "C"),
           A=c(0, 3.1, 2),
           B=c(3,0,2.1),
           C=c(1.1, 0.9, 0))
    
    df2 <- tibble(label = c("w", "x", "y", "z"),
                  values = c(0,1,2,3))
    
    df%>%mutate(across(A:C, round, digit=0)) %>%
         pivot_longer(-1, names_to="colnames", values_to=("values")) %>%
         left_join(df2) %>%
         select(1,2,4) %>% 
         pivot_wider(., 1:3, names_from="colnames", values_from="label")
    
    # A tibble: 3 x 4
      rownames A     B     C    
      <chr>    <chr> <chr> <chr>
    1 A        w     z     x    
    2 B        z     w     x    
    3 C        y     y     w    
    

    首先使用acrossround 所有值,然后pivot_longer 得到一个“long”格式,您可以在其中left_join em> 两个表按值。 选择删除包含数字的列,然后最后一个pivot_wider返回原始格式。

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 1970-01-01
      • 2022-01-01
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 2021-12-29
      相关资源
      最近更新 更多