我的数据框有一个列,我试图在其上运行字符串匹配,然后在匹配时更新字符串。我尝试了几种方法,但似乎没有工作。我的框架如下所示。对于列“IntNames”第2行,我想用clin2代替“clin2 | clin3 | clin4”,而只用clin6代替row3“clin6 | clin7 | clin8 | clin9 | clin10”。我们的想法是只保留这些值的第一个元素。我感谢您的所有帮助和意见。
DECLARE @TestA TABLE (ID INT, X INT, Y INT, Dv_Data XML);
INSERT @TestA VALUES
(101, 4, 5, '<U><V N="TTF">1</V><V N="MF">0</V><V N="ResultA">383.501</V></U>'),
(102, 4, 6, '<U><V N="TTF">0</V><V N="MF">1</V><V N="ResultA">383.601</V></U>');
SELECT *
FROM
(
SELECT T.ID,
T.X,
T.Y,
ColName = A.B.value('@N', 'VARCHAR(MAX)'),
ColVal = A.B.value('text()[1]', 'VARCHAR(MAX)')
FROM @TestA AS T
CROSS APPLY T.Dv_Data.nodes('U/V') AS A(B)
) AS T
PIVOT
(
MAX(ColVal) FOR ColName IN ([TTF], [MF], [ResultA])
) AS P;
答案 0 :(得分:2)
删除ifelse语句并使用substitution执行此任务:
myFrame$IntNames <- sub('\\|.*', '', myFrame$IntNames)
# IntNames values1 values2
# 1 clin1 100 10
# 2 clin2 200 4
# 3 clin6 240 5
答案 1 :(得分:1)
您可以使用## Replicate your data
myFrame = read.table(text="IntNames values1 values2
clin1 100 10
clin2|clin3|clin4 200 4
clin6|clin7|clin8|clin9|clin10 240 5",
header=TRUE)
myFrame$IntNames = sub("(\\.*?)\\|.*", "\\1", myFrame$IntNames)
myFrame
IntNames values1 values2
1 clin1 100 10
2 clin2 200 4
3 clin6 240 5
和正则表达式执行此操作。
<div>
<?php include 'tools/edit.php';?>
<form method="post">
<input type="submit" name="disable" value="Disable" />
<input type="submit" name="enable" value="Enable" />
</form>
</div>
答案 2 :(得分:1)
我们可以这样做(假设IntNames
是一个字符向量):
myFrame$IntNames<- unlist(lapply(strsplit(myFrame$IntNames, "[|]"), `[[`, 1))