在R中通过计算创建多个列
假设我有一个100 X 100的数据帧,这里是我的数据的一个小样本在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
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我已经包括了数据,这是从你的帖子。