Nun*_*ira 1 xml r dplyr tidyverse
我的数据框df如下所示:
Value
X.Y.Z 10
X.Y.K 20
X.Y.W 30
X.Y.Z.1 20
X.Y.K.1 5
X.Y.W.1 30
X.Y.Z.2 3
X.Y.K.2 23
X.Y.W.2 44
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用行名的第三个字符来对列进行命名,例如:
因此,行名现在是行的最后一个字符(在点之后)。我知道这是可能的做dplyr,我试过gather和spread,但没有运气,谁能帮助?
谢谢!
编辑:这是上面文本中的数据,我:
structure(list(..1 = c("X.Y.Z", "X.Y.K", "X.Y.W", "X.Y.Z.1",
"X.Y.K.1", "X.Y.W.1", "X.Y.Z.2", "X.Y.K.2", "X.Y.W.2"), Value = c(10,
20, 30, 20, 5, 30, 3, 23, 44)), class = "data.frame", row.names = c(NA,
-9L))
Run Code Online (Sandbox Code Playgroud)
library(dplyr)
library(tibble)
library(tidyr)
df1 %>%
rownames_to_column %>%
transmute(mycols = gsub('^.*\\.', '', gsub('.[[:digit:]]+', '', rowname)),
myrows = regmatches(rowname, gregexpr('[0-9]+',rowname)),
value = Value) %>%
spread(key=mycols, value=value)
Run Code Online (Sandbox Code Playgroud)
# myrows K W Z
# 1 20 30 10
# 2 1 5 30 20
# 3 2 23 44 3
Run Code Online (Sandbox Code Playgroud)
library(dplyr)
library(tidyr)
df1 %>%
mutate(mycols = substr(gsub('.[[:digit:]]+', '', rownames(.)), 5, 5),
myrows = as.integer(as.factor(substr(rownames(.),7,7)))-1) %>%
spread(key=mycols, value=Value)
#> myrows K W Z
#> 1 0 20 30 10
#> 2 1 5 30 20
#> 3 2 23 44 3
Run Code Online (Sandbox Code Playgroud)
数据:
df1 <- structure(list(Value = c(10, 20, 30, 20, 5, 30, 3, 23, 44)),
row.names = c("X.Y.Z", "X.Y.K", "X.Y.W", "X.Y.Z.1",
"X.Y.K.1", "X.Y.W.1", "X.Y.Z.2", "X.Y.K.2", "X.Y.W.2"),
class = "data.frame")
Run Code Online (Sandbox Code Playgroud)
正如我在评论中所说,由于$..1列导致的问题,我们需要清除数据dplyr。这是使用问题中提供的确切数据的解决方案:
df1 <- structure(list(..1 = c("X.Y.Z", "X.Y.K", "X.Y.W", "X.Y.Z.1",
"X.Y.K.1", "X.Y.W.1", "X.Y.Z.2", "X.Y.K.2", "X.Y.W.2"),
Value = c(10, 20, 30, 20, 5, 30, 3, 23, 44)),
class = "data.frame", row.names = c(NA, -9L))
library(dplyr)
library(janitor)
library(tidyr)
clean_names(df1) %>%
mutate(mycols = substr(gsub('.[[:digit:]]+', '', x1), 5, 5),
myrows = as.integer(as.factor(substr(x1,7,7)))-1) %>%
select(-x1) %>%
spread(key=mycols, value=value)
#> myrows K W Z
#> 1 0 20 30 10
#> 2 1 5 30 20
#> 3 2 23 44 3
Run Code Online (Sandbox Code Playgroud)
由reprex软件包(v0.3.0)创建于2019-07-29
结合其他方法,看看它们是否适用于OP的数据集。(没有可复制的示例,即使不是不可能,也很难解决;因此,这是我最后的努力)。
library(dplyr)
library(tibble)
library(tidyr)
Run Code Online (Sandbox Code Playgroud)
df1 %>%
rownames_to_column %>%
mutate(mycols = gsub('.[[:digit:]]+', '', rowname),
myrows = regmatches(rowname, gregexpr('[0-9]+',rowname))) %>%
select(-rowname) %>%
spread(key=mycols, value=Value)
Run Code Online (Sandbox Code Playgroud)
要么
df1 %>%
rownames_to_column %>%
separate(rowname,sep = "\\.", into = c("A1","B2","C3", "D4")) %>%
select(-A1,-B2) %>%
spread(key=C3, value=Value)
Run Code Online (Sandbox Code Playgroud)