使用R中的for循环将项与同一变量中的所有其他项进行比较

使用R中的for循环将项与同一变量中的所有其他项进行比较,r,for-loop,R,For Loop,我想创建一个数据矩阵,比较孩子们对单词标记的产生和他们对其他单词标记的产生。例如,在下面的示例数据集中,我想将第1行中的tedi与实际列中的其他形式进行比较 我的问题是:如何让R在值数据的所有行中重复计算C1_Sonorant[1,]-C1_Sonorant[2,],C1_辅音[1,]-C1_辅音[2,]?我很确定这将需要一个for循环,但我不确定如何以这种方式运行跨变量比较 我想我需要不同的矩阵来表示C1_声调、C1_辅音等,我希望输出结果如下: # C1_Sonorant output

我想创建一个数据矩阵,比较孩子们对单词标记的产生和他们对其他单词标记的产生。例如,在下面的示例数据集中,我想将第1行中的tedi与实际列中的其他形式进行比较

我的问题是:如何让R在值数据的所有行中重复计算C1_Sonorant[1,]-C1_Sonorant[2,],C1_辅音[1,]-C1_辅音[2,]?我很确定这将需要一个for循环,但我不确定如何以这种方式运行跨变量比较

我想我需要不同的矩阵来表示C1_声调、C1_辅音等,我希望输出结果如下:

 # C1_Sonorant

 output <- tribble(~Target, ~teddy, ~teddy, ~daddy, ~daddy,
       "teddy", 0, -2, -2, -2,
       "teddy", 2, 0, 0, 0,
       "daddy", 2, 0, 0, 0, 
       "daddy", 2, 0, 0, 0)

据我所知,你想将每一行与每一行进行比较,包括每一行本身

您可以按如下方式使用自联接或交叉联接来完成此操作。但对于一个非常大的数据集,这可能不会顺利运行

require(tidyverse)

df1 <- values %>% select(Target1 = Target,
                  Sonorant1 = C1_Sonorant,
                  Consonant1 = C1_Consonantal) %>%
  mutate(dummy = 1) %>%
  group_by(Target1) %>%
  mutate(newname1 = paste(Target1,row_number(),sep = "_")) %>%
  ungroup() %>%
  select(-Target1)

df2 <- df1 %>% select(newname2 = newname1,
                      Sonorant2 = Sonorant1,
                      Consonant2 = Consonant1,
                      dummy)

  df1 %>% inner_join(df2, by = 'dummy') %>%
    mutate(Son = Sonorant1 - Sonorant2,
           Con = Consonant1 - Consonant2) %>%
    select(newname1,newname2,Son,Con) %>%
    gather(key,value,-newname1,-newname2) %>%
    unite(column,newname2,key) %>%
    spread(column,value)

我在理解您试图做的事情的全部范围时遇到了一点困难,特别是您的预期输出与前两个任务的关系-例如,您的预期输出中的每个值代表前两个数据集的值是什么

不过,我可能能够为前面的每个任务单独提供一些东西。 对于第一个,有一个称为Levenhstein距离的度量,它提供了两个单词之间距离的度量,有关详细信息,请参见?adist

您可以按照以下步骤将其应用于第一个数据集的行:

apply(production.data, MARGIN = 1, FUN = function(r){
adist(r[["Target"]], r[["Actual"]])
})
对于第二个任务,zoo包中有一个函数,用于将函数应用于名为rollapply的滚动观察窗口,可以实现如下内容:

zoo::rollapply(values, by.column = F,width = 2, FUN = function(x){
x <- as.data.frame(x)  %>% dplyr::mutate_at(dplyr::vars(dplyr::starts_with("C")), ~ as.numeric(.)) # Since the object is converted to a matrix and it coerces all values to character, convert it to a data.frame and change the numeric values with names starting with C back into numeric.
c(x[1,3, drop = T] - x[2,3, drop = T],# Subtract row 1 C1_sonorant from row 2
x[1,4, drop = T] - x[2,4, drop = T])# Subtract row 1 C1_Consonantal from row 2
})

这管用!非常感谢。我使用了第二个选项,因为我必须将Sonorant和Coronal分离成不同的矩阵,但第一个选项也适用于更大的数据集。谢谢!我要和阿迪斯特玩一玩。不过,rollapply选项对我不起作用——它生成了一个包含两列的表,所有值都是NAs。要么这样,要么我得到一个警告:wrapup期间出错:承诺已在评估中:递归默认参数引用或更早的问题?当然!嗯,这很奇怪,你对rollapply有这样的问题,因为它在这个例子中工作得很好。我使用的是zoo 1.8-5和dplyr 0.7.8,也许您使用的是不同的版本?另一种猜测是,在完整数据集中的那些列中存在导致错误的意外值。您可以使用以下内容进行测试:purr::map_lglvalues[,stringr::str_detectNamesValue,^C],~all!is.naas.numeric。这将映射到名称以C开头的所有列,强制VAL为数字,并检查是否所有值都不是NA。即,TRUE表示所有值都是数值
# A tibble: 9 x 19
  newname1 baby_1_Con baby_1_Son daddy_1_Con daddy_1_Son daddy_2_Con daddy_2_Son daddy_3_Con daddy_3_Son doggy_1_Con
  <chr>         <dbl>      <dbl>       <dbl>       <dbl>       <dbl>       <dbl>       <dbl>       <dbl>       <dbl>
1 baby_1            0          0           0          -2           0          -2           0          -2           0
2 daddy_1           0          2           0           0           0           0           0           0           0
3 daddy_2           0          2           0           0           0           0           0           0           0
4 daddy_3           0          2           0           0           0           0           0           0           0
5 doggy_1           0          2           0           0           0           0           0           0           0
6 milk_1           -1          1          -1          -1          -1          -1          -1          -1          -1
7 teddy_1           0          0           0          -2           0          -2           0          -2           0
8 teddy_2           0          2           0           0           0           0           0           0           0
9 Tigger_1          0          0           0          -2           0          -2           0          -2           0
# ... with 9 more variables: doggy_1_Son <dbl>, milk_1_Con <dbl>, milk_1_Son <dbl>, teddy_1_Con <dbl>,
#   teddy_1_Son <dbl>, teddy_2_Con <dbl>, teddy_2_Son <dbl>, Tigger_1_Con <dbl>, Tigger_1_Son <dbl>
ones <- rep(1,nrow(values))
Son.mat <- values$C1_Sonorant %*% t(ones) - ones %*% t(values$C1_Sonorant)
rownames(Son.mat) <- values$Target
colnames(Son.mat) <- values$Target
Son.Mat
       teddy teddy daddy daddy daddy baby Tigger doggy milk
teddy      0    -2    -2    -2    -2    0      0    -2   -1
teddy      2     0     0     0     0    2      2     0    1
daddy      2     0     0     0     0    2      2     0    1
daddy      2     0     0     0     0    2      2     0    1
daddy      2     0     0     0     0    2      2     0    1
baby       0    -2    -2    -2    -2    0      0    -2   -1
Tigger     0    -2    -2    -2    -2    0      0    -2   -1
doggy      2     0     0     0     0    2      2     0    1
milk       1    -1    -1    -1    -1    1      1    -1    0
apply(production.data, MARGIN = 1, FUN = function(r){
adist(r[["Target"]], r[["Actual"]])
})
zoo::rollapply(values, by.column = F,width = 2, FUN = function(x){
x <- as.data.frame(x)  %>% dplyr::mutate_at(dplyr::vars(dplyr::starts_with("C")), ~ as.numeric(.)) # Since the object is converted to a matrix and it coerces all values to character, convert it to a data.frame and change the numeric values with names starting with C back into numeric.
c(x[1,3, drop = T] - x[2,3, drop = T],# Subtract row 1 C1_sonorant from row 2
x[1,4, drop = T] - x[2,4, drop = T])# Subtract row 1 C1_Consonantal from row 2
})