0

我的数据框包含两列:

               V1            V2
1         Austria  9.920692e-01
2         Austria  2.037756e+02
3         Austria -2.187730e+02
4         Belgium  7.590994e-01
5         Belgium  8.890127e+01
6         Belgium -1.796152e+02
7        Bulgaria  0.000000e+00
8        Bulgaria  0.000000e+00
9        Bulgaria  0.000000e+00
10        Croatia  3.763559e-01
11        Croatia -4.706601e+00
12        Croatia -3.878768e+02
13         Cyprus  0.000000e+00
14         Cyprus  0.000000e+00
15         Cyprus  0.000000e+00
16 Czech Republic           NaN
17 Czech Republic  0.000000e+00
18 Czech Republic           NaN
19        Denmark  0.000000e+00
20        Denmark  0.000000e+00
21        Denmark  0.000000e+00
22        Estonia  9.744620e-01
23        Estonia -2.265193e+02
24        Estonia -1.348241e+03

我需要让它变宽。像这样的东西:

     Austria  9.920692e-01 2.037756e+02 -2.187730e+02
     Belgium  7.590994e-01 8.890127e+01 -1.796152e+02

我尝试使用强制转换功能:

cast(df, V1 ~ V2)

结果我得到:

Using V2 as value column.  Use the value argument to cast to override this choice
error `[.data.frame`(data, , variables, drop = FALSE) :
  undefined columns selected

我应该如何解决我的问题

4

3 回答 3

2

基地你可以使用unstack

t(unstack(df[2:1]))
#                    [,1]        [,2]       [,3]
#Austria        0.9920692  203.775600  -218.7730
#Belgium        0.7590994   88.901270  -179.6152
#Bulgaria       0.0000000    0.000000     0.0000
#Croatia        0.3763559   -4.706601  -387.8768
#Cyprus         0.0000000    0.000000     0.0000
#Czech_Republic       NaN    0.000000        NaN
#Denmark        0.0000000    0.000000     0.0000
#Estonia        0.9744620 -226.519300 -1348.2410

数据:

df <- read.table(header=T, text="               V1            V2
1         Austria  9.920692e-01
2         Austria  2.037756e+02
3         Austria -2.187730e+02
4         Belgium  7.590994e-01
5         Belgium  8.890127e+01
6         Belgium -1.796152e+02
7        Bulgaria  0.000000e+00
8        Bulgaria  0.000000e+00
9        Bulgaria  0.000000e+00
10        Croatia  3.763559e-01
11        Croatia -4.706601e+00
12        Croatia -3.878768e+02
13         Cyprus  0.000000e+00
14         Cyprus  0.000000e+00
15         Cyprus  0.000000e+00
16 Czech_Republic           NaN
17 Czech_Republic  0.000000e+00
18 Czech_Republic           NaN
19        Denmark  0.000000e+00
20        Denmark  0.000000e+00
21        Denmark  0.000000e+00
22        Estonia  9.744620e-01
23        Estonia -2.265193e+02
24        Estonia -1.348241e+03")
于 2021-01-13T16:14:33.313 回答
1

使用tidyverse

library(dplyr)
library(tidyr)
#Code
df %>% group_by(V1) %>%
  mutate(id=row_number()) %>%
  pivot_wider(names_from = id,values_from=V2)

输出:

# A tibble: 8 x 4
# Groups:   V1 [8]
  V1                 `1`     `2`   `3`
  <chr>            <dbl>   <dbl> <dbl>
1 Austria          0.992  204     -219
2 Belgium          0.759   88.9   -180
3 Bulgaria         0        0        0
4 Croatia          0.376   -4.71  -388
5 Cyprus           0        0        0
6 Czech Republic NaN        0      NaN
7 Denmark          0        0        0
8 Estonia          0.974 -227    -1350

使用的一些数据:

#Data
df <- structure(list(V1 = c("Austria", "Austria", "Austria", "Belgium", 
"Belgium", "Belgium", "Bulgaria", "Bulgaria", "Bulgaria", "Croatia", 
"Croatia", "Croatia", "Cyprus", "Cyprus", "Cyprus", "Czech Republic", 
"Czech Republic", "Czech Republic", "Denmark", "Denmark", "Denmark", 
"Estonia", "Estonia", "Estonia"), V2 = c(0.992, 204, -219, 0.759, 
88.9, -180, 0, 0, 0, 0.376, -4.71, -388, 0, 0, 0, NaN, 0, NaN, 
0, 0, 0, 0.974, -227, -1350)), class = "data.frame", row.names = c(NA, 
-24L))
于 2021-01-13T16:15:53.133 回答
0

我们可以用dcast

library(data.table)
dcast(setDT(df), V1 ~ rowid(V1), value.var = 'V2')

-输出

#            V1         1           2          3
#1:        Austria 0.9920692  203.775600  -218.7730
#2:        Belgium 0.7590994   88.901270  -179.6152
#3:       Bulgaria 0.0000000    0.000000     0.0000
#4:        Croatia 0.3763559   -4.706601  -387.8768
#5:         Cyprus 0.0000000    0.000000     0.0000
#6: Czech Republic       NaN    0.000000        NaN
#7:        Denmark 0.0000000    0.000000     0.0000
#8:        Estonia 0.9744620 -226.519300 -1348.2410

数据

df <- structure(list(V1 = c("Austria", "Austria", "Austria", "Belgium", 
"Belgium", "Belgium", "Bulgaria", "Bulgaria", "Bulgaria", "Croatia", 
"Croatia", "Croatia", "Cyprus", "Cyprus", "Cyprus", "Czech Republic", 
"Czech Republic", "Czech Republic", "Denmark", "Denmark", "Denmark", 
"Estonia", "Estonia", "Estonia"), V2 = c(0.9920692, 203.7756, 
-218.773, 0.7590994, 88.90127, -179.6152, 0, 0, 0, 0.3763559, 
-4.706601, -387.8768, 0, 0, 0, NaN, 0, NaN, 0, 0, 0, 0.974462, 
-226.5193, -1348.241)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"
))
于 2021-01-13T16:12:47.767 回答