![](/img/trans.png)
[英]Sum a column based on the value of a cell in another column of the same row in R
[英]In R, how do I selectively 'copy and paste' a cell into another cell based on specific row/column criteria?
我有一些數據(見下文),其中我有參與者( ID
列)在三個變量( Name_A
、 Name_B
和Name_C
)上得分。 這些分數目前是根據X1Score
、 X2Score
和X3Score
列中的相關變量水平記錄的。 我希望將這些分數“復制並粘貼”(因為缺少更好的短語)到相關列 - Name_A
、 Name_B
和Name_C
(當前填充為NA
) - 這樣我就有了長格式的數據。 我該怎么做呢?
ID X1 X1Score X2 X2Score X3 X3Score Name_A Name_B Name_C
1 Name_A 4.58 Name_C 4.79 Name_B 5.22 NA NA NA
2 Name_C 5.35 Name_B 5.33 Name_A 5.61 NA NA NA
3 Name_B 5.59 Name_C 5.48 Name_A 4.89 NA NA NA
4 Name_C 5.36 Name_B 5.04 Name_A 4.93 NA NA NA
5 Name_A 5.39 Name_B 5.27 Name_C 5.11 NA NA NA
6 Name_C 4.91 Name_A 4.99 Name_B 5.01 NA NA NA
df <- structure(list(ID = 1:6,
X1 = c("Name_A", "Name_C", "Name_B", "Name_C", "Name_A", "Name_C"),
X1Score = c(4.58, 5.35, 5.59, 5.36, 5.39, 4.91),
X2 = c("Name_C", "Name_B", "Name_C", "Name_B", "Name_B", "Name_A"),
X2Score = c(4.79, 5.33, 5.48, 5.04, 5.27, 4.99),
X3 = c("Name_B", "Name_A", "Name_A", "Name_A", "Name_C", "Name_B"),
X3Score = c(5.22, 5.61, 4.89, 4.93, 5.11, 5.01),
Name_A = c(NA, NA, NA, NA, NA, NA),
Name_B = c(NA, NA, NA, NA, NA, NA),
Name_C = c(NA, NA, NA, NA, NA, NA)),
row.names = c(NA, -6L), class = "data.frame")
#Edit:我上面的原始請求太簡單了,雖然答案在技術上解決了這個問題,但我無法理解如何概括它。 因此,這是一個修改后的示例(其中唯一的主要區別是列的命名約定) - 盡管在上面的示例中使用相同的代碼,但此示例會產生錯誤。 我希望通過我的問題的另一個例子,我將能夠理解'X\\\\d+(.*)'
行,因為它看起來是讓它工作的關鍵。 這是更新的示例:
df <- structure(list(ID = 1:6,
X1_Name = c("Name_A", "Name_C", "Name_B", "Name_C", "Name_A", "Name_C"),
X1_Score = c(4.58, 5.35, 5.59, 5.36, 5.39, 4.91),
X5_Name = c("Name_C", "Name_B", "Name_C", "Name_B", "Name_B", "Name_A"),
X5_Score = c(4.79, 5.33, 5.48, 5.04, 5.27, 4.99),
X19_Name = c("Name_B", "Name_A", "Name_A", "Name_A", "Name_C", "Name_B"),
X19_Score = c(5.22, 5.61, 4.89, 4.93, 5.11, 5.01)),
row.names = c(NA, -6L), class = "data.frame")
df %>%
#get the data in long format creating two columns Name and Score
pivot_longer(cols = -ID,
names_to = '.value',
names_pattern = 'X\\d+(.*)') %>%
#Get data in wide format.
pivot_wider(names_from = Name, values_from = Score)
您可以使用pivot_longer
/ pivot_wider
執行整形 -
library(dplyr)
library(tidyr)
df %>%
#To drop empty NA columns
select(-starts_with('Name')) %>%
#Rename X1 to X1Name, X2 to X2Name and so on
rename_with(~paste0(., 'Name'), matches('^X\\d+$')) %>%
#get the data in long format creating two columns Name and Score
pivot_longer(cols = -ID,
names_to = '.value',
names_pattern = 'X\\d+(.*)') %>%
#Get data in wide format.
pivot_wider(names_from = Name, values_from = Score)
# ID Name_A Name_C Name_B
# <int> <dbl> <dbl> <dbl>
#1 1 4.58 4.79 5.22
#2 2 5.61 5.35 5.33
#3 3 4.89 5.48 5.59
#4 4 4.93 5.36 5.04
#5 5 5.39 5.11 5.27
#6 6 4.99 4.91 5.01
如果您想保留數據中的所有其他列並分別添加這 3 列,您可以將數據集與原始數據集連接起來。
...Code from above %>%
left_join(df %>% select(-starts_with('Name')), by = 'ID')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.