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