Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将关联因子匹配到R中的新列中_R_Tidyverse - Fatal编程技术网

将关联因子匹配到R中的新列中

将关联因子匹配到R中的新列中,r,tidyverse,R,Tidyverse,使用下面的数据,我想做一些广义化的事情,将带有因子的单个列转换为单独的链接列。在这里,“字母”列将创建两个新列“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

使用下面的数据,我想做一些广义化的事情,将带有因子的单个列转换为单独的链接列。在这里,“字母”列将创建两个新列“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
例如,有没有一种方法可以使用tidytext实现这一点?或者,扩展类似的内容可能会奏效:

model.matrix( ints ~ letters + reals, data = data )
在data.frame中显示的字母变量中不应包含c

如果你有很多字母,你可以使用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
在data.frame中显示的字母变量中不应包含c

如果你有很多字母,你可以使用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

我想这就是你想要的,假设你的例子中有一个打字错误:

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来实现这一点

我们可以通过data.table中的dcast来实现这一点


你需要什么还不清楚。为什么a列的第三行中有NA?这从长到宽都有,但您的数据都和其他实例不一致。修复了ints=1和b=.02的期望返回值-NA位于错误的元素中。您需要的内容不清楚。为什么a列第3行有NA?这是从长到宽,但您的数据都和其他实例不一致。修复了int=1和b=.02-NA位于错误元素中的期望返回。您可以使用dplyr对不同字母的列进行广义化吗?您可以使用dplyr对不同字母的列进行广义化吗?看起来很棒!修正了打字错误。看起来很棒!修正了打字错误。