将相关因素匹配到 R 中的新列中
Match associated factors into new columns in R
使用以下数据,我想做一些概括,将带有因子的单个列转换为单独的链接列。这里的 'letters' 列将创建两个新列 'a' 和 'b'.
data <- data.frame(letters = c("a", "a", "b", "c"),ints = c(1, 2, 1, 1), reals = c(.01, .22, .01, .02))
letters ints reals
a 1 0.01
a 2 0.22
b 1 0.01
b 1 0.02
想要return这样的东西。
ints a b
1 .01 NA
2 .22 NA
1 NA .01
1 NA .02
有没有办法使用 tidytext 来做到这一点?或者也许扩展这样的东西会起作用:
model.matrix( ints ~ letters + reals, data = data )
您的 letters
变量中不应有 c,如您在 data.frame 中所示。
你可以使用 dplyr
和 tidyr
如果你有很多字母
data1 <- data %>%
dplyr::mutate(id=seq_len(nrow(.))) %>%
tidyr::spread(letters, reals) %>%
dplyr::arrange(id)
> data1
ints id a b
1 1 1 0.01 NA
2 2 2 0.22 NA
3 1 3 NA 0.01
4 1 4 NA 0.02
或者如果你只有两个字母 a 和 b,你也可以使用 ifelse 来完成。
library(dplyr)
data1 <- data %>%
dplyr::mutate(a = ifelse(letters=="a"&ints%in%c(1,2), reals, NA),
b = ifelse(letters=="b"&ints==1, reals, NA))
> data1
letters ints reals a b
1 a 1 0.01 0.01 NA
2 a 2 0.22 0.22 NA
3 b 1 0.01 NA 0.01
4 b 1 0.02 NA 0.02
我想这就是你想要的,假设你的例子中有错字:
reshape(
transform(data,id=seq_len(nrow(data))),
idvar=c("id","ints"), timevar="letters", direction="wide"
)
# ints id reals.a reals.b
#1 1 1 0.01 NA
#2 2 2 0.22 NA
#3 1 3 NA 0.01
#4 1 4 NA 0.02
我们可以通过 data.table
中的 dcast
来做到这一点
library(data.table)
dcast(setDT(data), ints +rowid(ints) ~ letters, value.var = "reals")[order(ints_1)
][, ints_1 := NULL][]
# ints a b
#1: 1 0.01 NA
#2: 2 0.22 NA
#3: 1 NA 0.01
#4: 1 NA 0.02
使用以下数据,我想做一些概括,将带有因子的单个列转换为单独的链接列。这里的 'letters' 列将创建两个新列 'a' 和 'b'.
data <- data.frame(letters = c("a", "a", "b", "c"),ints = c(1, 2, 1, 1), reals = c(.01, .22, .01, .02))
letters ints reals
a 1 0.01
a 2 0.22
b 1 0.01
b 1 0.02
想要return这样的东西。
ints a b
1 .01 NA
2 .22 NA
1 NA .01
1 NA .02
有没有办法使用 tidytext 来做到这一点?或者也许扩展这样的东西会起作用:
model.matrix( ints ~ letters + reals, data = data )
您的 letters
变量中不应有 c,如您在 data.frame 中所示。
你可以使用 dplyr
和 tidyr
如果你有很多字母
data1 <- data %>%
dplyr::mutate(id=seq_len(nrow(.))) %>%
tidyr::spread(letters, reals) %>%
dplyr::arrange(id)
> data1
ints id a b
1 1 1 0.01 NA
2 2 2 0.22 NA
3 1 3 NA 0.01
4 1 4 NA 0.02
或者如果你只有两个字母 a 和 b,你也可以使用 ifelse 来完成。
library(dplyr)
data1 <- data %>%
dplyr::mutate(a = ifelse(letters=="a"&ints%in%c(1,2), reals, NA),
b = ifelse(letters=="b"&ints==1, reals, NA))
> data1
letters ints reals a b
1 a 1 0.01 0.01 NA
2 a 2 0.22 0.22 NA
3 b 1 0.01 NA 0.01
4 b 1 0.02 NA 0.02
我想这就是你想要的,假设你的例子中有错字:
reshape(
transform(data,id=seq_len(nrow(data))),
idvar=c("id","ints"), timevar="letters", direction="wide"
)
# ints id reals.a reals.b
#1 1 1 0.01 NA
#2 2 2 0.22 NA
#3 1 3 NA 0.01
#4 1 4 NA 0.02
我们可以通过 data.table
dcast
来做到这一点
library(data.table)
dcast(setDT(data), ints +rowid(ints) ~ letters, value.var = "reals")[order(ints_1)
][, ints_1 := NULL][]
# ints a b
#1: 1 0.01 NA
#2: 2 0.22 NA
#3: 1 NA 0.01
#4: 1 NA 0.02