为 R 中的 5-Likert 量表生成所有可能种群的算法(每个级别的累积频率为 0.1)
Algorithm to generate all possible populations for a 5-Likert Scale in R (cumulative frequency per level by 0.1)
我想以 5-likert 量表生成所有可能的总体,其值是每个级别中 0.1 的累积频率),例如:
[1] [2] [3] [4] [5]
1 0 0 0 0
0 1 0 0 0
...
0 0 0 0 1
0.9 0.1 0 0 0
0.9 0 0.1 0 0
...
0.8 0.2 0 0 0
0.8 0 0.2 0 0
...
0.8 0.1 0.1 0 0
等等...
我试过一些基本的循环,比如:
fin <- NULL
for (i in 1:10) {
a <- c(1-(i/10),0,0,0,0)
fin <- c(fin,a)
for (j in 1:10) {
b <- c(a[1],(j/10),0,0,0)
fin <- c(fin,b)
for (k in 1:10) {
c <- c(a[1],b[2],k/10,0,0)
fin <- c(fin,c)
for (l in 1:10) {
d <- c(a[1],b[2],c[3],l/10,0)
fin <- c(fin,d)
for (m in 1:10) {
e <- c(a[1],b[2],c[3],d[4],m/10)
fin <- c(fin,e)
}
}
}
}
}
dat <- as.data.frame(matrix(fin, ncol = 5, byrow = T))
head(dat)
a <- NULL
for (i in 1:111110) {
if(rowSums(dat[i,])==1)
{b <- dat[i,]
a <- c(a,b)}
else{
next
}
}
dat <- as.data.frame(matrix(fin, ncol = 5, byrow = T))
我知道它既不聪明又不高效,但 sum = 1 的行是我想要的一些情况,但这还不够。
非常感谢任何帮助。提前致谢。
创建包含所有允许值的向量
values <- seq(0, 1, by=0.1)
values
Returns:
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
使用基数 R expand.grid
获取五个变量的这些值的所有可能组合:
df <- expand.grid(A1 = values, A2 = values, A3 = values, A4 = values, A5 = values)
使用 rowSums
:
计算逐行总和
df$TestSum <- rowSums(df)
只保留 TestSum 为 1 的行(也只保留前 5 列,我们不再需要 TestSum 列):
result <- df[df$TestSum == 1, 1:5]
head(result)
Returns:
A1 A2 A3 A4 A5
11 1.0 0.0 0 0 0
21 0.9 0.1 0 0 0
31 0.8 0.2 0 0 0
41 0.7 0.3 0 0 0
51 0.6 0.4 0 0 0
61 0.5 0.5 0 0 0
首先使用 expand.grid
生成所有组合,然后仅过滤(例如使用 dplyr
)那些总和为 1 的行:
levels <- seq(0,1, 0.1)
expand.grid(L1 = levels,
L2 = levels,
L3 = levels,
L4 = levels,
L5 = levels) %>%
dplyr::mutate(sum = L1+L2+L3+L4+L5) %>%
dplyr::filter(sum == 1) %>%
dplyr::select(-sum)
我想以 5-likert 量表生成所有可能的总体,其值是每个级别中 0.1 的累积频率),例如:
[1] [2] [3] [4] [5]
1 0 0 0 0
0 1 0 0 0
...
0 0 0 0 1
0.9 0.1 0 0 0
0.9 0 0.1 0 0
...
0.8 0.2 0 0 0
0.8 0 0.2 0 0
...
0.8 0.1 0.1 0 0
等等...
我试过一些基本的循环,比如:
fin <- NULL
for (i in 1:10) {
a <- c(1-(i/10),0,0,0,0)
fin <- c(fin,a)
for (j in 1:10) {
b <- c(a[1],(j/10),0,0,0)
fin <- c(fin,b)
for (k in 1:10) {
c <- c(a[1],b[2],k/10,0,0)
fin <- c(fin,c)
for (l in 1:10) {
d <- c(a[1],b[2],c[3],l/10,0)
fin <- c(fin,d)
for (m in 1:10) {
e <- c(a[1],b[2],c[3],d[4],m/10)
fin <- c(fin,e)
}
}
}
}
}
dat <- as.data.frame(matrix(fin, ncol = 5, byrow = T))
head(dat)
a <- NULL
for (i in 1:111110) {
if(rowSums(dat[i,])==1)
{b <- dat[i,]
a <- c(a,b)}
else{
next
}
}
dat <- as.data.frame(matrix(fin, ncol = 5, byrow = T))
我知道它既不聪明又不高效,但 sum = 1 的行是我想要的一些情况,但这还不够。
非常感谢任何帮助。提前致谢。
创建包含所有允许值的向量
values <- seq(0, 1, by=0.1)
values
Returns:
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
使用基数 R expand.grid
获取五个变量的这些值的所有可能组合:
df <- expand.grid(A1 = values, A2 = values, A3 = values, A4 = values, A5 = values)
使用 rowSums
:
df$TestSum <- rowSums(df)
只保留 TestSum 为 1 的行(也只保留前 5 列,我们不再需要 TestSum 列):
result <- df[df$TestSum == 1, 1:5]
head(result)
Returns:
A1 A2 A3 A4 A5
11 1.0 0.0 0 0 0
21 0.9 0.1 0 0 0
31 0.8 0.2 0 0 0
41 0.7 0.3 0 0 0
51 0.6 0.4 0 0 0
61 0.5 0.5 0 0 0
首先使用 expand.grid
生成所有组合,然后仅过滤(例如使用 dplyr
)那些总和为 1 的行:
levels <- seq(0,1, 0.1)
expand.grid(L1 = levels,
L2 = levels,
L3 = levels,
L4 = levels,
L5 = levels) %>%
dplyr::mutate(sum = L1+L2+L3+L4+L5) %>%
dplyr::filter(sum == 1) %>%
dplyr::select(-sum)