尺度行值忽略列

发布于 2025-01-25 04:11:39 字数 188 浏览 3 评论 0原文

我有以下数据。Frame:

char   A     B     C
a      1     2     3
b     300  239   444
c      15   25    32

我需要通过将行值转换为0到1之间的间隔来忽略第一列,但要将其保留在结果中。

我该怎么办?

I have the following data.frame:

char   A     B     C
a      1     2     3
b     300  239   444
c      15   25    32

I need to normalize the data by transforming the row values into intervals between 0 and 1 ignoring the first column but keeping that in the results.

How could I do that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

給妳壹絲溫柔 2025-02-01 04:11:39

您可以这样做:

bind_cols(
  df %>% select(char),
  as.data.frame(t(apply(df[,-1],1,\(x) (x-min(x))/(max(x)-min(x))))))
)

输出:

  char        A         B C
1    a 0.000000 0.5000000 1
2    b 0.297561 0.0000000 1
3    c 0.000000 0.5882353 1

You can do this:

bind_cols(
  df %>% select(char),
  as.data.frame(t(apply(df[,-1],1,\(x) (x-min(x))/(max(x)-min(x))))))
)

Output:

  char        A         B C
1    a 0.000000 0.5000000 1
2    b 0.297561 0.0000000 1
3    c 0.000000 0.5882353 1
↙温凉少女 2025-02-01 04:11:39

您可以使用scales :: cescale()进行恢复连续矢量以具有指定的最小值和最大值。输出范围默认为c(0,1)

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(A:C) %>%
  group_by(char) %>%
  mutate(value = scales::rescale(value)) %>%
  ungroup() %>%
  pivot_wider()

版本2

df %>%
  rowwise() %>%
  mutate(x = list(scales::rescale(c_across(A:C))), .keep = "unused") %>%
  unnest_wider(x, names_sep = "")

输出

# # A tibble: 3 × 4
#   char      A     B     C
#   <chr> <dbl> <dbl> <dbl>
# 1 a     0     0.5       1
# 2 b     0.298 0         1
# 3 c     0     0.588     1

You can use scales::rescale() to rescale continuous vector to have specified minimum and maximum. The output range defaults to c(0, 1).

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(A:C) %>%
  group_by(char) %>%
  mutate(value = scales::rescale(value)) %>%
  ungroup() %>%
  pivot_wider()

Version 2

df %>%
  rowwise() %>%
  mutate(x = list(scales::rescale(c_across(A:C))), .keep = "unused") %>%
  unnest_wider(x, names_sep = "")

Output

# # A tibble: 3 × 4
#   char      A     B     C
#   <chr> <dbl> <dbl> <dbl>
# 1 a     0     0.5       1
# 2 b     0.298 0         1
# 3 c     0     0.588     1
人生百味 2025-02-01 04:11:39

使用PMIN/PMAX

mn <- do.call(pmin, df1[-1])
mx <- do.call(pmax, df1[-1])
df1[-1] <- (df1[-1] - mn)/(mx - mn)
df1
  char        A         B C
1    a 0.000000 0.5000000 1
2    b 0.297561 0.0000000 1
3    c 0.000000 0.5882353 1

或其他选项是recale dapply

library(collapse)
library(scales)
df1[-1] <- dapply(df1[-1], MARGIN = 1, FUN = rescale)

-Output

> df1
  char        A         B C
1    a 0.000000 0.5000000 1
2    b 0.297561 0.0000000 1
3    c 0.000000 0.5882353 1

数据

df1 <- structure(list(char = c("a", "b", "c"), A = c(0, 0.297560975609756, 
0), B = c(0.5, 0, 0.588235294117647), C = c(1, 1, 1)), 
row.names = c(NA, 
-3L), class = "data.frame")

Using pmin/pmax

mn <- do.call(pmin, df1[-1])
mx <- do.call(pmax, df1[-1])
df1[-1] <- (df1[-1] - mn)/(mx - mn)
df1
  char        A         B C
1    a 0.000000 0.5000000 1
2    b 0.297561 0.0000000 1
3    c 0.000000 0.5882353 1

Or another option is rescale with dapply

library(collapse)
library(scales)
df1[-1] <- dapply(df1[-1], MARGIN = 1, FUN = rescale)

-output

> df1
  char        A         B C
1    a 0.000000 0.5000000 1
2    b 0.297561 0.0000000 1
3    c 0.000000 0.5882353 1

data

df1 <- structure(list(char = c("a", "b", "c"), A = c(0, 0.297560975609756, 
0), B = c(0.5, 0, 0.588235294117647), C = c(1, 1, 1)), 
row.names = c(NA, 
-3L), class = "data.frame")
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文