在R中通过计算创建多个列

在R中通过计算创建多个列,r,R,假设我有一个100 X 100的数据帧,这里是我的数据的一个小样本 df<-read.table (text=" Id san1 san2 san3 1 A A A 2 A A A 3 A M M 4 M A A ", header=TRUE) 我使用dft进行转置,然后使用mutate和rowsumes,但它对我不起作用。这能满足您的要求吗 这是你想要的吗 我们可以使用 library(data.tab

假设我有一个100 X 100的数据帧,这里是我的数据的一个小样本

df<-read.table (text=" Id   san1    san2    san3
1   A   A   A
2   A   A   A
3   A   M   M
4   M   A   A
", header=TRUE)

我使用dft进行转置,然后使用mutate和rowsumes,但它对我不起作用。

这能满足您的要求吗


这是你想要的吗

我们可以使用

library(data.table)
library(tidyr)
data.table::transpose(df, make.names = 'Id', keep.names = 'San') %>%
     mutate(A = rowSums(.[-1] == 'A'), M = rowSums(.[2:5] == 'M'))
-输出

#    San 1 2 3 4 A M
#1 san1 A A A M 3 1
#2 san2 A A M A 3 1
#3 san3 A A M A 3 1
我们可以使用

library(data.table)
library(tidyr)
data.table::transpose(df, make.names = 'Id', keep.names = 'San') %>%
     mutate(A = rowSums(.[-1] == 'A'), M = rowSums(.[2:5] == 'M'))
-输出

#    San 1 2 3 4 A M
#1 san1 A A A M 3 1
#2 san2 A A M A 3 1
#3 san3 A A M A 3 1
以下是dplyr解决方案:

library(dplyr)

df %>% 
  pivot_longer(-Id) %>% 
  pivot_wider(names_from = Id, values_from = value) %>% 
  rename(San = name) %>% 
  mutate(A = rowSums(. == "A"),
         M = rowSums(. == "M"))
A <- data.frame(t(df[-1]))
names(A) <- df[,1]
cbind(A, as.data.frame.matrix(t(table(stack(df[-1])))))
     1 2 3 4 A M
san1 A A A M 3 1
san2 A A M A 3 1
san3 A A M A 3 1
这给了我们:

  San   `1`   `2`   `3`   `4`       A     M
  <chr> <chr> <chr> <chr> <chr> <dbl> <dbl>
1 san1  A     A     A     M         3     1
2 san2  A     A     M     A         3     1
3 san3  A     A     M     A         3     1
以下是dplyr解决方案:

library(dplyr)

df %>% 
  pivot_longer(-Id) %>% 
  pivot_wider(names_from = Id, values_from = value) %>% 
  rename(San = name) %>% 
  mutate(A = rowSums(. == "A"),
         M = rowSums(. == "M"))
A <- data.frame(t(df[-1]))
names(A) <- df[,1]
cbind(A, as.data.frame.matrix(t(table(stack(df[-1])))))
     1 2 3 4 A M
san1 A A A M 3 1
san2 A A M A 3 1
san3 A A M A 3 1
这给了我们:

  San   `1`   `2`   `3`   `4`       A     M
  <chr> <chr> <chr> <chr> <chr> <dbl> <dbl>
1 san1  A     A     A     M         3     1
2 san2  A     A     M     A         3     1
3 san3  A     A     M     A         3     1

另一个基本的R解决方案:

library(dplyr)

df %>% 
  pivot_longer(-Id) %>% 
  pivot_wider(names_from = Id, values_from = value) %>% 
  rename(San = name) %>% 
  mutate(A = rowSums(. == "A"),
         M = rowSums(. == "M"))
A <- data.frame(t(df[-1]))
names(A) <- df[,1]
cbind(A, as.data.frame.matrix(t(table(stack(df[-1])))))
     1 2 3 4 A M
san1 A A A M 3 1
san2 A A M A 3 1
san3 A A M A 3 1

另一个基本的R解决方案:

library(dplyr)

df %>% 
  pivot_longer(-Id) %>% 
  pivot_wider(names_from = Id, values_from = value) %>% 
  rename(San = name) %>% 
  mutate(A = rowSums(. == "A"),
         M = rowSums(. == "M"))
A <- data.frame(t(df[-1]))
names(A) <- df[,1]
cbind(A, as.data.frame.matrix(t(table(stack(df[-1])))))
     1 2 3 4 A M
san1 A A A M 3 1
san2 A A M A 3 1
san3 A A M A 3 1

使用purrr提供的表和映射dfr,另一个独立于A、M和剩余值工作的解决方案:

后果
使用purrr提供的表和映射dfr,另一个独立于A、M和剩余值工作的解决方案:

后果
抱歉,它不适用于我,因为它不反映我的输出。也不适用于大型dataSorry,它不适用于我,因为它不反映我的输出。也不适用于大型企业data@user330您的postError上的数据是否相同:data.table::transposedf中的意外“=”,make.names='Id',keep.names='San'>%mutate1=A和M假设,我想将其用于任何二进制数据,例如0,1@user330在这种情况下,您可以只进行行和运算。[2:5]和行和运算!。[2:5]错误:data.table::transposedf,make.names='Id',keep.names='San'>%mutateA=rowSums.[2:5],M=rowSums!。[2:5]@user330是否与postError上的数据相同:data.table::transposedf中出现意外的“=”,make.names='Id',keep.names='San'>%mutate1=A和M,我想将其用于任何二进制数据,例如0,1@user330在这种情况下,您可以只进行行和运算。[2:5]和行和运算!。[2:5]错误:data.table::transposedf,make.names='Id',keep.names='San'>%mutateA=rowSums.[2:5],M=rowSums!。[2:5]很抱歉,它不适用于我的数据,我的数据中没有求和cloumns@user330我已经包括了数据,它来自你的帖子。对不起,它不适用于我的数据,我没有在我的日志中得到总和cloumns@user330我已经包括了数据,这是从你的帖子。